我要问的是,即使已为它分配了 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
在代码中被认为是不好的风格,因为手动管理内存是不必要的困难。
您可以对代码中的每个新内容使用 delete。这绝对是内存泄漏。
根据评论编辑:- 如果您使用智能指针,那么您绝对不应该关心内存管理细节。
任何通过new分配的内存都必须通过delete释放,否则会出现内存泄漏。如果您分配为:
std::string *p = new std::string();
解除分配为:
delete p;
如果您分配为:
std::string *p = new std::string[10]; // more than one
解除分配为:
delete [] p;