nullptr是否会释放指针的内存?

时间:2014-10-16 09:18:49

标签: c++ pointers nullptr

我要问的是,即使已经为其指定了nullptr,也应删除指针。

例如,在以下情况中:

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

在nullptr释放之前占用内存还是我们面临内存泄漏?

4 个答案:

答案 0 :(得分:10)

不,此代码泄露了您使用new分配的对象。

如果对象分配了new,则必须使用delete取消分配。


  

我要问的是,即使已经为其指定了nullptr,也应删除指针。

您使用的术语表明您正在以错误的方式思考这个问题。它不是您需要删除的指针,而是对象。指针只是代码引用对象的一种方式。指针变量包含对象的地址。您可以拥有多个指针变量,这些变量都引用同一个对象。您不删除指针,删除对象。

现在,你写这样的解除分配似乎很奇怪:

delete foo;

天真地你可能认为这是意思,删除指针foo 。但这并不意味着。这意味着,删除其地址存储在foo 中的对象。

答案 1 :(得分:3)

这是内存泄漏。但是,想要自动删除对象并不是不合理的。这得到标准库的支持:

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

在代码中使用newdelete被认为是不好的风格,因为手动管理内存是不必要的。

答案 2 :(得分:0)

您已对代码中的每个新用途使用删除。这肯定是内存泄漏。

根据评论编辑: - 如果你使用智能指针,那么你绝对不应该关心内存管理细节。

答案 3 :(得分:0)

通过new分配的任何内存都必须通过delete释放,否则会出现内存泄漏。 如果您分配为:

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

解除分配为:

delete p;

如果您分配为:

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

解除分配为:

delete [] p;