Re[3]: Создание своего класса
От: Юрий Жмеренецкий ICQ 380412032
Дата: 25.07.09 03:21
Оценка: 3 (1)
Здравствуйте, 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) в том, что такого удаления в деструкторе не производится.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.