Простенький такой вопросик
От: romka_911  
Дата: 07.02.02 10:06
Оценка:
Здрасте,

сразу попрошу не бить ногами за такие вопросы, а помочь

Ситуация следующая, есть обьект и укаыатель на него. Где-то в программе он удаляется (delete pObj). Итак, вопрос — как по-интеллегентнее узнать что обьект удален (указатель после удаления обьекта NULL не равен) и не пытаться сделать етого еще раз, в идеале — проигнорировать такой вызов.

Пасиба за сострадание.
Re: Простенький такой вопросик
От: GromRom Россия  
Дата: 07.02.02 10:18
Оценка: 3 (1)
Здравствуйте romka_911, Вы писали:

R9>Ситуация следующая, есть обьект и укаыатель на него. Где-то в программе он удаляется (delete pObj). Итак, вопрос — как по-интеллегентнее узнать что обьект удален (указатель после удаления обьекта NULL не равен) и не пытаться сделать етого еще раз, в идеале — проигнорировать такой вызов.


Ну я обычно делаю так:
CSomeClass *a = new CSomeClass(....);
//использование
delete a;
a=NULL;

if(a!=NULL){ // или if(a){
a = new CSomeClass(....);
//использование
// либо здесь же удаляем
delete a;
a=NULL;
}

//либо, удаляем здесь
delete a; // удаление NULL ЛЮБОЙ КОМПИЛЯТОР ОБЯЗАН ОБРАБАТЫВАТЬ КОРРЕКТНО!!!
Девиз настоящих студентов: Не боись — ПРОРВЁМСЯ
Re: Простенький такой вопросик
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 07.02.02 10:22
Оценка:
Здравствуйте romka_911, Вы писали:

R9>Здрасте,


R9>сразу попрошу не бить ногами за такие вопросы, а помочь

Без проблем. Для того тут и посажены . Вооюще, это место для вопросов. Те, кто пытаются прыгать, или сразу драться — глубоко не правы. Хотя преценденты есть.

R9>Ситуация следующая, есть обьект и укаыатель на него. Где-то в программе он удаляется (delete pObj). Итак, вопрос — как по-интеллегентнее узнать что обьект удален (указатель после удаления обьекта NULL не равен) и не пытаться сделать етого еще раз, в идеале — проигнорировать такой вызов.


Если указатель — обычный, то можно (в Windows) пользоваться IsBadReadPtr, IsBadWritePtr. В общем же случае такого не стоит допускать. Если ты находишься в одном потоке с тем местом, в котором объект был удален, указатель на него стоит занулить. Если же ты сохранил указатель где-нибудь, то тут трабла.

Методика поиска всех указателей не объект (правда, это уже не совсем обычные указатели, не встроенные) описана в последних главах книги Джеффа Элджера "С++" из серии "Библиотека программиста". Советую. Правда, применять ее вряд ли кто будет в обычной ситуации )

С уважением
Алексей Кирдин
Re: Простенький такой вопросик
От: romka_911  
Дата: 07.02.02 10:36
Оценка:
Спасибо за ответы,

но вот интересно, почему MS не сделал где-то в недрах того-же delete присвоение поинтеру NULL, by design так сказать ...

Thanx.
Re[2]: Простенький такой вопросик
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 07.02.02 10:48
Оценка:
Здравствуйте romka_911, Вы писали:

R9>Спасибо за ответы,


R9>но вот интересно, почему MS не сделал где-то в недрах того-же delete присвоение поинтеру NULL, by design так сказать ...


А зачем. Программист — сам дурак, раз этим пользоваться не умеет. А, во-вторых, это в стандарте не прописано. А как же мы в таком месте, как управление памятью, стандарта слушаться не будем? И потом, синтаксис операторов следующий:

void operator delete( void* address );
void operator delete( void* address, size_t bytes );

А чтоб сделать то, что ты предложил, надо бы иметь такой:
void operator delete( void*& address );
void operator delete( void*& address, size_t bytes );
Алексей Кирдин
Re: Простенький такой вопросик
От: VuDZ Россия  
Дата: 07.02.02 12:21
Оценка:
Здравствуйте romka_911, Вы писали:

R9>Здрасте,


R9>сразу попрошу не бить ногами за такие вопросы, а помочь


R9>Ситуация следующая, есть обьект и укаыатель на него. Где-то в программе он удаляется (delete pObj). Итак, вопрос — как по-интеллегентнее узнать что обьект удален (указатель после удаления обьекта NULL не равен) и не пытаться сделать етого еще раз, в идеале — проигнорировать такой вызов.


R9>Пасиба за сострадание.


IsBadReadPtr()
IsBadWritePtr()
IsBadStringPtr()
Re: Простенький такой вопросик
От: KoraK Россия http:\\none.ru
Дата: 07.02.02 17:05
Оценка: 6 (1)
Здравствуйте romka_911, Вы писали:

R9>Здрасте,


R9>сразу попрошу не бить ногами за такие вопросы, а помочь


R9>Ситуация следующая, есть обьект и укаыатель на него. Где-то в программе он удаляется (delete pObj). Итак, вопрос — как по-интеллегентнее узнать что обьект удален (указатель после удаления обьекта NULL не равен) и не пытаться сделать етого еще раз, в идеале — проигнорировать такой вызов.


R9>Пасиба за сострадание.



Ключевое слово — умные указатели (smart pointer)
Re[2]: Простенький такой вопросик
От: Андрей Тарасевич Беларусь  
Дата: 07.02.02 17:49
Оценка:
Здравствуйте romka_911, Вы писали:

R9>но вот интересно, почему MS не сделал где-то в недрах того-же delete присвоение поинтеру NULL, by design так сказать ...


Это ничего не даст. Проблема заключается в том, что у тебя может быть 5 указателей на один и тот же объект. Удаляешь ты его через один указатель, в результате остальные остаются указывать в никуда. Никакой MS и "присвоение поинтеру NULL" тебе тут помочь не может.

А с одним указателем никаких проблем нет.
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.