Тема: Способы работы со строками

Доброго времени суток, Знатоки!
Последнее время сталкиваюсь с тем, что операции со строками происходят непредсказуемо.
Есть задача: при удалении объектов необходимо среди оставшихся найти те, у которых в расширенных данных в имени приложения содержится строчка типа "Some text ... handle", где handle - это AcDbHandle удаленного объекта, преобразованный в char или ACHAR.
вот я делаю - создаю массив HandleArray типа AcArray <string>

void DbReactor::objectErased(const AcDbDatabase * dwg, const AcDbObject * dbObj, Adesk::Boolean  pErased)
{
AcDbBlockReference *pInsert=AcDbBlockReference::cast(dbObj);
    if (!pInsert)
        {
        acutPrintf("\nРассматриваемый объект не является блоком!-выход из реактора на удаление!");
        return;
        }
    string cstr;
    AcDbHandle h;
    char *strh=new char;
    resbuf *pRB;
    pRB=pInsert->xData(NULL);
    if (pRB!=NULL)
        {
        pInsert->getAcDbHandle(h);
        if (h.isNull()!=false)
        acutNewBuffer(strh,17);    
        h.getIntoAsciiBuffer(strh);
        cstr.append("Точки привязки для объекта ");
        cstr.append(strh);
        {DocVars.docData().HandleArray.append(cstr);
        acutPrintf("\nОпределили родительский объект и записали хэндл в массив:");}
                }        
    if (pRB)acutRelRb(pRB);
    acutDelString(strh);
cstr.clear();
    if(pInsert)pInsert=NULL;
     }

Затем иду читать:

void EdReactor::commandEnded(const char * cmdStr)
{    
int i;
long j=0;
SaveLayerLockState();
j=DocVars.docData().HandleArray.length();
for (i=0;i<j;i++)
    {
    acutPrintf("\nСтрока handleов: %d , содержимое: %s",i,DocVars.docData().HandleArray.at(i).c_str());
    SSCreate(DocVars.docData().HandleArray.at(i).c_str());
      }
RestoreLayerLockState();
return;
}

Далее происходит создание набора по фильтру с расш. данными, и удаление всего ранее неудаленного, которое попало в этот набор. Проблема возникает периодически:
вылетает AutoCAD на попытке сформировать набор по фильтру с расш. данными из-за ошибочного прочтения части записей созданного массива. Проблема возникает, когда удаляется сразу большое количество объектов. Например, записал я в массив строчку: Точки привязки для объекта 7B5C7, а читается T_1T_1ивязки для объекта 7B5C7. Вылетает (AutoCAD2005, MSVS 2002). Этой проблемы не возникает при операциях с небольшим количеством объектов немного раз.
Какими классами и методами пользуются для работы со строками
(формирование строковых массивов, запись/чтение, преобразование в char* для передачи как аргумента в функции ObjectARX и т.д.)? Из-за чего вылетает? как такие проблемы решаются?

Re: Способы работы со строками

Попробуй заменить AcArray<string> на CStringArray или vector<string>.

Re: Способы работы со строками

Большое спасибо :)))) Все проблемы решились переходом на vector <string>. Особенно замечательно то, что его удобно обнулять. Читаем массив с конца в начало и сразу же обнуляем, память не теряется, строки не искажаются:

j=DocVars.docData().HandleArray.size();
for (i=j-1;i>-1;i--)
    {
    string st;
    st=DocVars.docData().HandleArray.at(i);
    acutPrintf("\nСтрока handleов: %d , содержимое: %s",i,st.c_str());
    SSCreate(st.c_str());
    DocVars.docData().HandleArray.pop_back();
    st.clear();
      }

Re: Способы работы со строками

> Зигмус
Я только совершенно не понял зачем:

st.clear();

Совершенно лишняя операция!