Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Borland C++ Builder/Turbo C++ Explorer > Решить проблему утечки памяти в циклической функции.


Автор: Сергей85 11.10.21, 15:57
Самописная функция разбития строки в TStringList. TStringList делается только методом New - при каждом вызове память расходуется.

Было решение: объявить TStringList глобальным - и просто очищать в теле функции. Работало долго - но в одной из программ (именно в одной) заглючило: при повторном вызове функции разрушаются данные в том TStringList, который был возвращен предыдущим вызовом.

Как решить проблему NEW в теле функции - при условии, что функция должна именно возвращать TStringList?

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    TStringList * _fastcall TForm_Main::slSplit(const AnsiString asString, const AnsiString asSeparator) //В билдере отсутствует функция Split.
    {
        AnsiString asTemp_Local = "";
     
        for (int iTemp=0; iTemp<asString.Length(); iTemp++) asTemp_Local = asTemp_Local + asString.SubString(iTemp+1,1); //Чтобы не портить саму вызываемую asString.
        //StrCopy(asTemp_Local.c_str(), asString.c_str()); //Эта дрянь не работает на длинных строках, разрушая память, - эту ошибку искал часов 5.
     
        char *cString = asTemp_Local.c_str(), *cTok = NULL;
        const char *cSeparator = asSeparator.c_str();
        [B]TStringList *slResult = new TStringList;[/B]
     
        for (cTok = strtok(cString, cSeparator); cTok; cTok = strtok(NULL, cSeparator)) slResult->Add(Trim((AnsiString)cTok));
     
        return slResult;
    }

Автор: Сергей85 10.05.22, 08:39
"объявить TStringList глобальным" - единственное решение.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)