c++ - 我应该删除 main.cpp 中 new 关键字创建的东西吗?

标签 c++ memory

如果我理解正确(我并没有声称我理解正确),您应该删除在您的析构函数中使用new关键字创建的任何内容对于特定的类。这样可以防止内存泄漏。示例:

#include "Bar.h"

Bar *bar_ = NULL;

Foo::Foo()
{
    bar_= new Bar;
}

Foo::~Foo()
{
    delete bar_;
    bar_ = NULL;
}

但是您应该删除 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;
}

最佳答案

简短回答:是的,清理你的内存。

更长的答案:

我不知道哪个操作系统不会清除您造成的内存泄漏,但无论如何您都应该这样做。当您运行内存泄漏检测工具并且不会被来自 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这样的智能指针,当它们超出范围时,这将为您释放内存。

关于c++ - 我应该删除 main.cpp 中 new 关键字创建的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28800798/

相关文章:

c++ - 迁移到VS2013比较运算符错误C2678 :binary '==' no operator

java - 每次运行 Java 都会创建一个新的 JVM 实例和一个新的堆吗?

memory - Keras 在调用 train_on_batch、fit 等时使用过多的 GPU 内存

c - Valgrind 读取大小无效

c++ - 缓冲区溢出到不同的 exe 内存中?或者从远程桌面编到 csrss.exe?

c++ - 如何在 Qt 中的 QTextEdit 中显示文本后面或前景的图形对象?

c++ - direct3d9 如何为像素艺术过滤纹理

android - 如何通过 Android NDK r20 使用 ndk-stack?

c++ - 在 C++ 中删除 boost 包装器中的对象

java - 在 Java 中获取可用 RAM