Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 глобальным" - единственное решение. |