Да.
Единственный «вред», который он может сделать, - это ввести неэффективность (ненужную операцию хранилища) в вашу программу, но эти накладные расходы будут незначительными по сравнению со стоимостью выделения и освобождения блока памяти в большинстве случаев.
Если вы этого не сделаете, однажды у вас будут неприятные ошибки разыменования указателя.
Я всегда использую макрос для удаления:
#define SAFEDELETE(ptr) { delete(ptr); ptr = NULL; }
(и аналогично для массива free (), освобождая дескрипторы)
Вы также можете написать методы «самостоятельного удаления», которые принимают ссылку на указатель вызывающего кода, поэтому они принудительно указывают указатель вызывающего кода на NULL. Например, чтобы удалить поддерево многих объектов:
static void TreeItem::DeleteSubtree(TreeItem *&rootObject)
{
if (rootObject == NULL)
return;
rootObject->UnlinkFromParent();
for (int i = 0; i < numChildren)
DeleteSubtree(rootObject->child[i]);
delete rootObject;
rootObject = NULL;
}
редактировать
Да, эти методы нарушают некоторые правила использования макросов (и да, в наши дни вы, вероятно, могли бы достичь того же результата с помощью шаблонов), но, используя многие годы, я никогда не обращался к мертвой памяти - одной из самых отвратительных и трудных и наиболее трудоемкий для устранения проблем, с которыми вы можете столкнуться. На практике в течение многих лет они эффективно устраняли класс ошибок в каждой команде, в которой я их представил.
Есть также много способов, как вы могли бы реализовать вышесказанное - я просто пытаюсь проиллюстрировать идею принуждения людей к NULL-указателю, если они удаляют объект, вместо того, чтобы предоставить им средство для освобождения памяти, которая не NULL, указатель вызывающей стороны ,
Конечно, приведенный выше пример является лишь шагом к автоматическому указателю. Что я и не предлагал, потому что ОП специально спрашивал о том, чтобы не использовать автоматический указатель.
delete
Тем не менее, это безопасно для нулевого указателя, что является одной из причин, по которой обнуление указателя может быть хорошим.