我应该删除main.cpp中new关键字创建的内容吗?

时间:2015-03-02 00:00:34

标签: c++ memory

如果我理解正确(我没有声明我这样做),您应该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;
}

4 个答案:

答案 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_ptrstd::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返回指针,但您的foobar_变量未声明为指针,因此您需要修复:

#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_ptrstd::unique_ptrstd::shared_ptr智能包装为您完成此任务类)。