1

以下是代码:

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

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

4

4 回答 4

3

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

于 2012-08-20T08:35:47.680 回答
1

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

于 2012-08-20T08:36:13.870 回答
0

内存未被释放(由编译器):不会调用析构函数。每个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

于 2012-08-20T08:53:06.550 回答
0

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

于 2012-08-20T08:37:31.363 回答