我要问的是,即使已经为其指定了nullptr,也应删除指针。
例如,在以下情况中:
std::string* foo = new std::string ("foo");
foo = nullptr;
在nullptr释放之前占用内存还是我们面临内存泄漏?
答案 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
在代码中使用new
或delete
被认为是不好的风格,因为手动管理内存是不必要的。
答案 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;