Да.
Единственный «вред», который он может сделать, - это ввести в вашу программу неэффективность (ненужную операцию хранения), но эти накладные расходы будут незначительными по сравнению со стоимостью выделения и освобождения блока памяти в большинстве случаев.
Если вы этого не сделаете, у вас будет однажды появятся некоторые неприятные ошибки разыменования указателя.
Я всегда использую макрос для удаления:
#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. указатель звонящего.
Конечно, приведенный выше пример является лишь шагом к автоматическому указателю. Что я и не предлагал, потому что ОП конкретно спрашивал о том, чтобы не использовать автоматический указатель.