如果我理解正确(我没有声明我这样做),您应该delete
使用new
关键字为特定班级创建的Destructor
关键字。这可以防止内存泄漏。例如:
#include "Bar.h"
Bar *bar_ = NULL;
Foo::Foo()
{
bar_= new Bar;
}
Foo::~Foo()
{
delete bar_;
bar_ = NULL;
}
但是你应该在delete
中创建new
main.cpp
件事吗?或者,当它们超出范围时,它们会被Destructors
自动删除吗?
#include "Foo.h"
int main()
{
MakeNewFoo();
//Do other stuff and forget foo ever existed
exit(0);
}
void MakeNewFoo(){
Foo *foo = new Foo;
}
答案 0 :(得分:4)
简短回答:是的,清理你的记忆。
更长的答案:
我不知道操作系统不会清除您创建的内存泄漏,但无论如何都应该这样做。当您运行内存泄漏检测工具时,它变得特别有用,并且不会受到来自main.cpp的一堆“错误”肯定的影响。
此外,这样的事情怎么样?
int main()
{
BigStructure foo* = new BigStructure(/*...*/);
// some computations to get variables
// at this point foo is no longer needed
RestOfProgramFunction1(); // long running, resource heavy
RestOfProgramFunction2(); // long running, resource heavy
}
现在你已经掌握了一堆你不再需要的内存,这为你需要的其他功能留下了更少的内存。
您有责任释放您分配的任何内存。如果您不想在 时关注,请使用std::unique_ptr
或std::shared_ptr
这样的智能指针,它们会在外出时为您释放内存范围。
答案 1 :(得分:2)
使用new
创建的所有内容都将在程序在内存中执行的整个过程中或使用delete
删除时存在。是的,您应该在退出Foo
之前删除MakeNewFoo
。
答案 2 :(得分:2)
"或者,当他们离开范围时,他们是否会被他们的析构函数自动删除?"
不,它们不会被删除,你会发生内存泄漏。
通常,您不能直接在C ++中使用new
/ delete
。您更喜欢使用标准Dynamic memory management类中的智能指针:
class Foo {
unique_ptr<Bar> bar_;
public:
Foo() : bar_(new Bar) {}
~Foo() {} // delete is automatically managed by unique_ptr<Bar>
};
相同的免费功能样本:
void MakeNewFoo(){
std::unique_ptr<Foo> foo(new Foo());
// Do stuff with foo
} // Will be deleted as soon foo goes out of scope
但是如果您使用new
/ new[]
,则必须使用delete
/ delete[]
进行清理,是的。
答案 3 :(得分:1)
首先,您展示的代码无法编译,因为new
返回指针,但您的foo
和bar_
变量未声明为指针,因此您需要修复:
#include "Bar.h"
Bar *bar_ = NULL;
Foo::Foo()
{
bar_= new Bar;
}
Foo::~Foo()
{
delete bar_;
bar_ = NULL;
}
#include "Foo.h"
int main()
{
MakeNewFoo();
//Do other stuff and forget foo ever existed
exit(0);
}
void MakeNewFoo(){
Foo *foo = new Foo;
}
现在,如上所述,您可以看到MakeNewFoo()
有内存泄漏,因为Foo
分配的new
对象永远不会使用delete
释放。是的,从技术上讲,操作系统将在进程终止时回收内存。但是,如果在MakeNewFoo()
之外的代码的其他位置调用了main()
,该怎么办?因此,最好始终delete
new
(或让C ++通过std::auto_ptr
,std::unique_ptr
和std::shared_ptr
智能包装为您完成此任务类)。