Освобождает ли nullptr память указателя?

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

Например, в следующем случае:

std::string* foo = new std::string ("foo");
foo = nullptr;

Занята ли память до выпуска nullptr или мы сталкиваемся с утечкой памяти?


person Antonio Garosi    schedule 16.10.2014    source источник
comment
Нет. Это утечка памяти.   -  person Galik    schedule 16.10.2014
comment
Нет, здесь нет волшебного освобождения памяти. Присваивание просто изменяет значение указателя.   -  person juanchopanza    schedule 16.10.2014
comment
Кто тебе это сказал? Нет!   -  person Marco A.    schedule 16.10.2014
comment
Используйте интеллектуальные указатели, чтобы избежать утечек памяти. В порядке следующее: unique_ptr<int> p(new int); p = nullptr;   -  person Neil Kirk    schedule 16.10.2014


Ответы (4)


Нет, этот код пропускает объект, который вы выделили с помощью new.

Если объект выделяется с помощью new, он должен быть освобожден с помощью delete.


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

Используемая вами терминология указывает на то, что вы думаете об этом неправильно. Вам нужно удалить не указатель, а объект. Указатель — это просто способ для вашего кода ссылаться на объект. Переменная-указатель содержит адрес объекта. У вас может быть несколько переменных-указателей, которые ссылаются на один и тот же объект. Вы не удаляете указатель, вы удаляете объект.

Теперь может показаться странным, что вы пишете освобождение следующим образом:

delete foo;

Наивно вы можете подумать, что это означает удалить указатель foo. Но это не значит. Это означает удалить объект, адрес которого хранится в foo.

person David Heffernan    schedule 16.10.2014

Это утечка памяти. Однако вполне разумно желать, чтобы объект удалялся автоматически. Это поддерживается стандартной библиотекой:

std::unique_ptr<std::string> foo = new std::string ("foo");
//better:
auto foo = std::make_unique<std::string>("foo");
//also see std::shared_ptr and std::make_shared
foo = nullptr; //automatically deletes the string

Плохим стилем считается наличие в коде new или delete, так как излишне сложно управлять памятью вручную.

person nwp    schedule 16.10.2014

Любая память, выделенная с помощью new, должна быть освобождена с помощью удаления, иначе произойдет утечка памяти. Если вы выделили как:

std::string *p = new std::string();

освободить как:

delete p;

Если вы выделили как:

std::string *p = new std::string[10]; // more than one

освободить как:

delete [] p;
person Dr. Debasish Jana    schedule 16.10.2014

Вы используете удаление для каждого нового в вашем коде. Это определенно утечка памяти.

ОТРЕДАКТИРОВАНО В СООТВЕТСТВИИ С КОММЕНТАРИЯМИ: - Если вы используете интеллектуальные указатели, вам определенно не следует заботиться о деталях управления памятью.

person ravi    schedule 16.10.2014
comment
@NeilKirk Я собирался сказать, что если вы используете интеллектуальный указатель, то вы не используете new, а затем ударил себя ногой, потому что это явно неправильно. Может быть, @ravi следует изменить ответ, чтобы читать каждую пару новых/необработанных указателей, поскольку только тогда, когда у вас есть оба, у вас могут возникнуть утечки памяти? - person Baldrickk; 16.10.2014