C/C++

Простой вопрос про динамическую память, new/delete, C++

При использовании delete не остаётся ли висячей ссылки? После этого не нужно указатель ставить в NULL?
Пример:
int* pointer=new int;
delete pointer;
//pointer=NULL; <--- нужна ли эта строчка?
ссылка остается, но просто ей не пользуйтесь и тогда обнулять не нужно. Хуже от обнуления не будет
ВЦ
Виталий Цыбаровский
78 045
Лучший ответ
Нет, не остается... Вернее она остается, но доступна для использования и под любые типы данных
Sake ***
Sake ***
90 175
Каждый раз при использовании указателя его следует проверять на валидность. Например,

void print(int* ptr, const size_t length) {
if (ptr != nullptr) {
for (auto i = 0U; i < length; ++i) std::cout << ptr[i] << ' ';
puts("");
}
}

Если передать в функцию указатель, которому после освобождения памяти не был присвоен nullptr, вы получите ошибку времени выполнения связанную с нарушением доступа для чтения либо записи.

void fn(int* ptr) {
if (ptr != nullptr) *ptr = 8; // ошибка записи
}

// TODO:

auto ptr = new int;
delete ptr;
fn(ptr); // передача в функцию «битого» указателя
#include < iostream >

using namespace std;

int main(int argc, char** argv)
{
int* pointer = new int;

cout << pointer << endl;

delete pointer;
pointer = 0; // если так, то норм, а иначе вылет в ошибку, вот и делай сам выводы

cout << pointer << endl;

delete pointer;

return 0;
}
SI
Solo Il Tuo
86 893
Ничего не остается.
Твои new/delete используют парные аллокатор/деаллокатор. Если ты не переопределишь случайно их непарно, то никаких утечек и крашей не будет (ну, если считать, что память выделилась успешно, никакие bad_alloc не полетели).

Ну а сам указатель при вызове delete не изменится, так что если тебе нужно его проверять потом на валидность, обнуляй.
Не нужна.

Делит освобождает выделенную память под ссылку.