Я спрашиваю, следует ли удалять указатель, даже если ему был назначен nullptr.
Например, в следующем случае:
std::string* foo = new std::string ("foo");
foo = nullptr;
Занята ли память до выпуска nullptr или мы сталкиваемся с утечкой памяти?
Я спрашиваю, следует ли удалять указатель, даже если ему был назначен nullptr.
Например, в следующем случае:
std::string* foo = new std::string ("foo");
foo = nullptr;
Занята ли память до выпуска nullptr или мы сталкиваемся с утечкой памяти?
Нет, этот код пропускает объект, который вы выделили с помощью new
.
Если объект выделяется с помощью new
, он должен быть освобожден с помощью delete
.
Я спрашиваю, следует ли удалять указатель, даже если ему был назначен nullptr.
Используемая вами терминология указывает на то, что вы думаете об этом неправильно. Вам нужно удалить не указатель, а объект. Указатель — это просто способ для вашего кода ссылаться на объект. Переменная-указатель содержит адрес объекта. У вас может быть несколько переменных-указателей, которые ссылаются на один и тот же объект. Вы не удаляете указатель, вы удаляете объект.
Теперь может показаться странным, что вы пишете освобождение следующим образом:
delete foo;
Наивно вы можете подумать, что это означает удалить указатель foo. Но это не значит. Это означает удалить объект, адрес которого хранится в foo.
Это утечка памяти. Однако вполне разумно желать, чтобы объект удалялся автоматически. Это поддерживается стандартной библиотекой:
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
, так как излишне сложно управлять памятью вручную.
Любая память, выделенная с помощью new, должна быть освобождена с помощью удаления, иначе произойдет утечка памяти. Если вы выделили как:
std::string *p = new std::string();
освободить как:
delete p;
Если вы выделили как:
std::string *p = new std::string[10]; // more than one
освободить как:
delete [] p;
Вы используете удаление для каждого нового в вашем коде. Это определенно утечка памяти.
ОТРЕДАКТИРОВАНО В СООТВЕТСТВИИ С КОММЕНТАРИЯМИ: - Если вы используете интеллектуальные указатели, вам определенно не следует заботиться о деталях управления памятью.
new
, а затем ударил себя ногой, потому что это явно неправильно. Может быть, @ravi следует изменить ответ, чтобы читать каждую пару новых/необработанных указателей, поскольку только тогда, когда у вас есть оба, у вас могут возникнуть утечки памяти?
- person Baldrickk; 16.10.2014
unique_ptr<int> p(new int); p = nullptr;
- person Neil Kirk   schedule 16.10.2014