【问题标题】:Free memory from process space从进程空间释放内存
【发布时间】:2012-08-20 08:33:19
【问题描述】:

以下是代码:

class x
{
    int k;
};
int main()
{
    x *p=new x[1000000];
    return 0;// can be  1 too
}

现在的问题是,当我们退出主函数时,分配的内存是由编译器调用析构函数释放还是由操作系统释放,因为进程将不再存在。?

【问题讨论】:

  • 关于来自main的返回值的说明:零被认为是“好的”,而非零被认为是错误返回码。

标签: c++


【解决方案1】:

不会调用析构函数,但任何体面的操作系统都会回收已失效进程的所有资源。然而,该标准对实现没有这样的要求。

【讨论】:

  • 我想他知道这一点。他想知道 C++ 是否会首先清理这些东西。
  • 可能跑题了:有没有办法在堆栈溢出时删除 cmets?
  • @bchurchill 将鼠标移到评论的右侧。应该有一个x
  • @bchurchill 那么答案是“不”。
【解决方案2】:

C++ 不会释放任何内存,除非你也告诉它。我不太熟悉退出在 C++ 中的工作方式,但我很确定是操作系统在这里释放了所有内存。如果你调用 exit() 函数,C++ 可能会帮你清理。

【讨论】:

    【解决方案3】:

    作为开发人员,您确实应该为此负责。最好使用智能指针。除此之外,一旦程序终止,操作系统应该为您整理。 c++ 语言本身不会回收您分配的内存。

    【讨论】:

      【解决方案4】:

      内存未被释放(由编译器):不会调用析构函数。每个new(或new [])都必须有一个对应的delete(或delete []):C++ 让您管理内存,您必须注意这一点!顺便说一句,当您的程序运行完毕时,操作系统会回收资源(因此使用的内存会被系统释放)。

      A* a = new A; 
      delete a;
      

      被编译器解释为

      // assuming new throws std::bad_alloc upon failure
      A* a = ::operator new(sizeof(A)); 
      a->A::A();
      if ( a != 0 ) {  // a check is necessary for delete
          a->~A(); // DESTRUCTOR IS CALLED BY THE DELETE OPERATOR
          ::operator delete(a);
      }
      

      (来源:http://www.codeproject.com/Articles/4795/C-Standard-Allocator-An-Introduction-and-Implement

      【讨论】:

        猜你喜欢
        • 2016-09-03
        • 2017-09-12
        • 2018-07-18
        • 2021-02-14
        • 2017-05-14
        • 2012-01-25
        • 2020-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多