сразу попрошу не бить ногами за такие вопросы, а помочь
Ситуация следующая, есть обьект и укаыатель на него. Где-то в программе он удаляется (delete pObj). Итак, вопрос — как по-интеллегентнее узнать что обьект удален (указатель после удаления обьекта NULL не равен) и не пытаться сделать етого еще раз, в идеале — проигнорировать такой вызов.
Здравствуйте 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 ЛЮБОЙ КОМПИЛЯТОР ОБЯЗАН ОБРАБАТЫВАТЬ КОРРЕКТНО!!!
Здравствуйте romka_911, Вы писали:
R9>Здрасте,
R9>сразу попрошу не бить ногами за такие вопросы, а помочь
Без проблем. Для того тут и посажены . Вооюще, это место для вопросов. Те, кто пытаются прыгать, или сразу драться — глубоко не правы. Хотя преценденты есть.
R9>Ситуация следующая, есть обьект и укаыатель на него. Где-то в программе он удаляется (delete pObj). Итак, вопрос — как по-интеллегентнее узнать что обьект удален (указатель после удаления обьекта NULL не равен) и не пытаться сделать етого еще раз, в идеале — проигнорировать такой вызов.
Если указатель — обычный, то можно (в Windows) пользоваться IsBadReadPtr, IsBadWritePtr. В общем же случае такого не стоит допускать. Если ты находишься в одном потоке с тем местом, в котором объект был удален, указатель на него стоит занулить. Если же ты сохранил указатель где-нибудь, то тут трабла.
Методика поиска всех указателей не объект (правда, это уже не совсем обычные указатели, не встроенные) описана в последних главах книги Джеффа Элджера "С++" из серии "Библиотека программиста". Советую. Правда, применять ее вряд ли кто будет в обычной ситуации )
Здравствуйте romka_911, Вы писали:
R9>Спасибо за ответы,
R9>но вот интересно, почему MS не сделал где-то в недрах того-же delete присвоение поинтеру NULL, by design так сказать ...
А зачем. Программист — сам дурак, раз этим пользоваться не умеет. А, во-вторых, это в стандарте не прописано. А как же мы в таком месте, как управление памятью, стандарта слушаться не будем? И потом, синтаксис операторов следующий:
Здравствуйте romka_911, Вы писали:
R9>Здрасте,
R9>сразу попрошу не бить ногами за такие вопросы, а помочь
R9>Ситуация следующая, есть обьект и укаыатель на него. Где-то в программе он удаляется (delete pObj). Итак, вопрос — как по-интеллегентнее узнать что обьект удален (указатель после удаления обьекта NULL не равен) и не пытаться сделать етого еще раз, в идеале — проигнорировать такой вызов.
R9>Пасиба за сострадание.
Здравствуйте romka_911, Вы писали:
R9>Здрасте,
R9>сразу попрошу не бить ногами за такие вопросы, а помочь
R9>Ситуация следующая, есть обьект и укаыатель на него. Где-то в программе он удаляется (delete pObj). Итак, вопрос — как по-интеллегентнее узнать что обьект удален (указатель после удаления обьекта NULL не равен) и не пытаться сделать етого еще раз, в идеале — проигнорировать такой вызов.
R9>Пасиба за сострадание.
Здравствуйте romka_911, Вы писали:
R9>но вот интересно, почему MS не сделал где-то в недрах того-же delete присвоение поинтеру NULL, by design так сказать ...
Это ничего не даст. Проблема заключается в том, что у тебя может быть 5 указателей на один и тот же объект. Удаляешь ты его через один указатель, в результате остальные остаются указывать в никуда. Никакой MS и "присвоение поинтеру NULL" тебе тут помочь не может.