
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.5] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Hi everybody!
![]() Пиплз, объясните мне пожалуйста в чем разница между delete и delete []...? Почему при удалении объекта delete [] вылетает "даже имени не спросив"? Да совсем забыл, как определить проинициализирован ли объект? |
Сообщ.
#2
,
|
|
|
Цитата Unknown_Error, 26.11.04, 06:59 delete[] обычно используется для удаления динам. массива, а не одиночного объекта. Для массивов типов, у которых нет деструкторов, можно использовать и delete, хотя это - моветон. Если же у типа есть деструктор, то использовать delete для массива таких объектов нельзя - деструктор будет вызван только для 0-ого элемента.Пиплз, объясните мне пожалуйста в чем разница между delete и delete []...? Цитата Unknown_Error, 26.11.04, 06:59 А это уже надо в код глянутьПочему при удалении объекта delete [] вылетает "даже имени не спросив"? Цитата Unknown_Error, 26.11.04, 06:59 Проверить, что его значение равно значению инициализации... Или что имелось ввиду? Да совсем забыл, как определить проинициализирован ли объект? |
Сообщ.
#3
,
|
|
|
Вообще по стандарту, если применить delete к массиву, - undefined behavior:
Цитата In the first alternative (delete object), the value of the operand of delete shall be a pointer to a non-array object created by a new-expression, or a pointer to a sub-object representing a base class of such an object. If not, the behavior is undefined. Чаще всего это UB выражается невызовом деструкторов для всех элементов массива. |
Сообщ.
#4
,
|
|
|
Цитата Adil, 26.11.04, 06:50 Проверить, что его значение равно значению инициализации... Или что имелось ввиду? Да вот только я хотел сделать следующую штуку ![]() ![]() TMy::~TMy() { ... this = NULL; // Ругается! } Как сделать, чтобы при удалении объекта, его указатель становился равным NULL? |
Сообщ.
#5
,
|
|
|
Его указатель или указатель на него? Второе будет выполнено автоматически, если удаляешь как
delete (одного указателя) или delete [] (целого массива). Если первое, то можешь сделать delete this, но это в общем то, не нужно. Если у тебя объект НЕ используется как указатель, то указатель на this будет автоматически удалён после действий деструктора. Если не доверяешь - можешь это прописать явно. |
Сообщ.
#6
,
|
|
|
TMy *my_variable = new TMy;
delete my_variable, my_variable = NULL; |
Сообщ.
#7
,
|
|
|
Цитата Sazabis, 26.11.04, 12:40 TMy *my_variable = new TMy; delete my_variable, my_variable = NULL; Так то оно так, так как не может быть иначе! ![]() Но вся трабла заключается в том, что у меня указателей несколько, и какой именно вызвал этот метод мне незвестен. |
Сообщ.
#8
,
|
|
|
Не понял?..
Цитата Но вся трабла заключается в том, что у меня указателей несколько, и какой именно вызвал этот метод мне незвестен. ? Они у тебя разных типов что ли? Не совсем понятна причина траблы.. код то твой? |
Сообщ.
#9
,
|
|
|
после delete my_variable
вызовется TMy::~TMy() { ... // this = NULL; // Ругается! // this == my_variable!!, та что выше была delete } |
Сообщ.
#10
,
|
|
|
Цитата Unknown_Error @ 26.11.04, 15:35 Как сделать, чтобы при удалении объекта, его указатель становился равным NULL? Не понятно, а для чего тебе это? ![]() Добавлено Просто если у тебя есть указатель на класс TMy в каком либо другом классе, например в CClass, то в CClass и присваивай данному указателю NULL... Добавлено Блин, тебе что нужно сделать подсчет ссылок? А именно следить за количеством указателей, ссылающихся на обьект, и когда счетчик становится равным 0, объект удаляется. Или если я не правильно понял, то обьясни подробней, что тебе нужно??? |
Сообщ.
#11
,
|
|
|
Ок...
Объясняю по нормальному вообщем хотел я сделать такую штуку,если кто работал в Дельфи, то там видел, что у каждого объекта есть метод Free который проверяет пустой ли указатель (ну всмысле равен NULL), если нет то он удаляет объект Цитата Они у тебя разных типов что ли? Не совсем понятна причина траблы.. код то твой? Если бы они были разных типов, то я не думаю, что они бы могли (ну по крайней мере все) вызвать метод данного объекта... Тьфу ты, да точно извиняюсь я свой пост тот, что выше неправильно изложил... |
Сообщ.
#12
,
|
|
|
В С++ этого не нужно делать!
Так как обькт создается при вызове конструктора, а убивается при вызове деструктора. Если тебе прям необходимо очистить обьект, до конца модуля, вызови деструктор для данного обьекта и все... |
Сообщ.
#13
,
|
|
|
хорошо, что произойдет если я сделаю так
![]() ![]() delete MyObj; delete MyObj; |
Сообщ.
#14
,
|
|
|
На втором delete программа тебе скажет #$%%$&&^!@#...
![]() |
Сообщ.
#15
,
|
|
|
Неизвестно что может произойти, малоли что там по указателю после первого delete. За частую будешь ловить exception.
делай delete MyObj, MyObj = NULL; тогда второй delete MyObj не должен сработать по стандарту. Для полной уверенности можешь писать так ![]() ![]() if( MyObj )delete MyObj, MyObj = NULL; |