0

我要问的是,即使已为它分配了 nullptr,是否也应删除指针。

例如,在以下情况下:

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

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

4

4 回答 4

10

不,此代码泄漏了您分配的对象new

如果一个对象是用 分配的new,它必须用 来释放delete


我要问的是,即使已为它分配了 nullptr,是否也应删除指针。

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

现在,您像这样编写释放分配可能看起来很奇怪:

delete foo;

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

于 2014-10-16T09:19:40.177 回答
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在代码中被认为是不好的风格,因为手动管理内存是不必要的困难。

于 2014-10-16T09:31:19.380 回答
0

您可以对代码中的每个新内容使用 delete。这绝对是内存泄漏。

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

于 2014-10-16T09:20:25.060 回答
0

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

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

解除分配为:

delete p;

如果您分配为:

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

解除分配为:

delete [] p;
于 2014-10-16T09:28:38.893 回答