【问题标题】:delete doesn't work in destructor?删除在析构函数中不起作用?
【发布时间】:2013-06-27 18:29:09
【问题描述】:

我在删除类的析构函数中的类属性时遇到问题,如果我尝试在经典程序程序中执行相同的操作,它会完美运行。

但是如果我尝试执行下面的代码,析构函数不会delete "array" 并且不会释放内存:

class MyClass
{
private:
    int *array;
    int n = 2000000;
public:
    MyClass(){
        this->array = new int[n];
        for(int i=0; i<n; i++){
            array[i] = i;
        }
    }
    ~MyClass(){
        delete[] array;
    }
};


int main(int argc, const char * argv[])
{
    MyClass *test = new MyClass;

    delete test;

    return 0;
}

为什么?

【问题讨论】:

  • 为什么不改用std::vector
  • 内存没有立即返回给操作系统并不意味着内存没有在应用程序“堆”中被释放。
  • 内存被标记为空闲,但它并未从进程中取消映射。原因之一是因为以后分配内存会更快,因为操作系统不必将新页面映射到进程。如果另一个进程迫切需要这些内存页面,它们将被重新映射。
  • 只是好奇您使用的是哪个编译器?我使用 VS012 为数组分配/删除大量整数进行了测试,我可以看到内存是如何释放的。

标签: c++ memory-management destructor


【解决方案1】:

如果你的类的析构函数中的delete语句被执行,在构造函数中分配的内存将被释放,可供以后使用。

这并不意味着操作系统为实例化您的类的实际进程分配的内存将会减少。

作为附加提示:要检测程序中的“真实”内存泄漏,请使用合适的工具,如 Valgrind 或类似工具。

【讨论】:

    【解决方案2】:

    当您使用 new 或 malloc 分配内存并在之后释放它时,这并不一定意味着内存会返回给操作系统。实现可以保留内存,后续对 malloc 或 new 的调用可以利用该内存来避免再次从 OS 分配内存的开销。

    【讨论】:

      猜你喜欢
      • 2012-10-11
      • 2013-01-21
      • 2013-05-06
      • 2013-09-30
      • 2012-03-13
      • 2012-08-11
      • 2014-12-30
      • 2013-11-16
      • 1970-01-01
      相关资源
      最近更新 更多