Да, это безопасно.
Нет ничего плохого в удалении нулевого указателя; это часто уменьшает количество тестов в хвосте функции, если нераспределенные указатели инициализируются нулями, а затем просто удаляются.
Поскольку предыдущее предложение вызвало путаницу, пример - который не является исключением исключений - того, что описано:
void somefunc(void)
{
SomeType *pst = 0;
AnotherType *pat = 0;
…
pst = new SomeType;
…
if (…)
{
pat = new AnotherType[10];
…
}
if (…)
{
…code using pat sometimes…
}
delete[] pat;
delete pst;
}
Существуют всевозможные гниды, которые можно выбрать с помощью примера кода, но концепция (я надеюсь) ясна. Переменные-указатели инициализируются нулями, поэтому операции delete
в конце функции не должны проверять, не являются ли они ненулевыми в исходном коде; код библиотеки выполняет эту проверку в любом случае.