Здравствуйте, FewartPro, Вы писали:
...
F>>Я не понял, вам формулировка сообщения об ошибке не нравится или что?
FP>Проблема в том, что посмотрев работу встроенных классов в Borland C++, например такой код:
FP>TStringList *slStringList = new TStringList();
FP>slStringList->Add(123);
FP>ShowMessage(slStringList->Strings[0]); //Здесь выводит значение: 123
FP>delete slStringList;
FP>ShowMessage(slStringList->Strings[0]); //Здесь выводит ошибку (..class EAccessViolation with message 'Access violation at address...), в отличии от созданного мной класса который выдает значение: "".
В С++ поведение программ, содержащих неопределенное поведение, никак не специфицированно. Результатом может быть и "", и "1", и access violation, и т.д. Такая программа даже не обязана компилироваться.
Неопределенное поведение возникает здесь:
TMyStringList *StringList = new TMyStringList();
//...
delete slStringList;
ShowMessage(slStringList->Strings[0]);
Выражение 'slStringList->Strings[0]' эквивалентно '(*slStringList).Strings[0]', которое содержит разыменование указателя. Но после выполнения 'delete' указатель имеет 'инвалидное' значение, доступ к которому приводит к неопределенному поведению.
FP>Поэтому меня и интересует может я что делаю не так при создании класса?.
Это совершенно другой вопрос.
FP>Не происходит ли утечки памяти в созданном мною классе?.
Вот в этом коде:
class TMyStringList
{
private:
TList *lList;
//...
};
TMyStringList::TMyStringList()
{
this->lList = new TList;
}
TMyStringList::~TMyStringList()
{
delete this->lList;
this->lList = NULL;
}
void TMyStringList::Add(AnsiString iValue)
{
AnsiString *iVal = new AnsiString;
*iVal = iValue;
this->lList->Add(iVal);
}
//...
TMyStringList *StringList = new TMyStringList();
StringList->Add("123");
ShowMessage(StringList->Value[0]);
delete StringList;
наличие утечек зависит от того, что из себя представляет TList (точнее — выполняется ли в деструкторе TList удаление элементов, добавленных с помощью TList::Add). Есть подозрения (вызванные наличием функции TMyStringList::Clear) в том, что такого удаления в деструкторе не производится.