Здравствуйте, FewartPro, Вы писали:
FP>Здраствуйте!!!
FP>Помогите решить проблему.
FP>Осваиваю создание своих классов на C++ Borland
Не трогай дядю за носик и вообще отойди от гроба.
FP>Затем в файле Unit1.cpp, есть код:
FP>TMyStringList *StringList = new TMyStringList(); FP>StringList->Add("123"); FP>ShowMessage(StringList->Value[0]); \\Здесь выводит 123 FP>delete StringList; FP>ShowMessage(StringList->Value[0]); \\Здесь за место ошибкиAccess violation at address), выдает значение "", после чего вылезает ошибка ...class EInvalidPointer with message "Invalid pointer operation"... FP>Подскажите какие ошибки я допускаю при создании класса?
Ты сначала убил объект, а потом к нему обращаешься. Вот скажи: если бы с тобой так поступили (сначала убили, а потом спросили который час) тебе бы понравилось?
Здравствуйте, 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>Не происходит ли утечки памяти в созданном мною классе?.
наличие утечек зависит от того, что из себя представляет TList (точнее — выполняется ли в деструкторе TList удаление элементов, добавленных с помощью TList::Add). Есть подозрения (вызванные наличием функции TMyStringList::Clear) в том, что такого удаления в деструкторе не производится.
TMyStringList *StringList = new TMyStringList();
StringList->Add("123");
ShowMessage(StringList->Value[0]); \\Здесь выводит 123
delete StringList;
ShowMessage(StringList->Value[0]); \\Здесь за место ошибкиAccess violation at address), выдает значение "", после чего вылезает ошибка ...class EInvalidPointer with message "Invalid pointer operation"...
Подскажите какие ошибки я допускаю при создании класса?
Здравствуйте, FewartPro, Вы писали:
FP>Здраствуйте!!!
FP>delete StringList; FP>ShowMessage(StringList->Value[0]); \\Здесь за место ошибкиAccess violation at address), выдает значение "", после чего вылезает ошибка ...class EInvalidPointer with message "Invalid pointer operation"... FP>Подскажите какие ошибки я допускаю при создании класса?
Я не понял, вам формулировка сообщения об ошибке не нравится или что?
Здравствуйте, denisko, Вы писали:
D>Не трогай дядю за носик и вообще отойди от гроба.
Этот дядя одним из первых (из коммерческих компиляторов) добавил частичную (и немалую) поддержку фич C++0x
Здравствуйте, byleas, Вы писали:
B>Здравствуйте, denisko, Вы писали:
D>>Не трогай дядю за носик и вообще отойди от гроба. B>Этот дядя одним из первых (из коммерческих компиляторов) добавил частичную (и немалую) поддержку фич C++0x
Этот дядя умеет добавлять поддержку кучи непереносимых вещей, с которыми потом приходиццо трахацца.
Здравствуйте, Fwiffo, Вы писали:
F>Здравствуйте, FewartPro, Вы писали:
FP>>Здраствуйте!!!
FP>>delete StringList; FP>>ShowMessage(StringList->Value[0]); \\Здесь за место ошибкиAccess violation at address), выдает значение "", после чего вылезает ошибка ...class EInvalidPointer with message "Invalid pointer operation"... FP>>Подскажите какие ошибки я допускаю при создании класса?
F>Я не понял, вам формулировка сообщения об ошибке не нравится или что?
Проблема в том, что посмотрев работу встроенных классов в Borland C++, например такой код:
TStringList *slStringList = new TStringList();
slStringList->Add(123);
ShowMessage(slStringList->Strings[0]); //Здесь выводит значение: 123
delete slStringList;
ShowMessage(slStringList->Strings[0]); //Здесь выводит ошибку (..class EAccessViolation with message 'Access violation at address...), в отличии от созданного мной класса который выдает значение: "".
Поэтому меня и интересует может я что делаю не так при создании класса?. Не происходит ли утечки памяти в созданном мною классе?. Посоветуйте какие нибудь книги по созданию классов на C++ Borland.