我在VS2005中写了一段测试代码:
#include <stdio.h>
class Base {
public:
Base() {printf("Base +\n");};
~Base() {printf("Base -\n");};
char val[1024 * 1024 * 100];
};
void main()
{
Base *p = new Base();
return;
}
构建,打开cmd窗口,然后执行此控制台应用程序。 打开Windows任务管理器以查看内存使用状态。
我发现两件事: 1没有调用析构函数; 2 Windows任务管理器结果没有内存泄漏。
是由C ++运行时删除的内存,还是在进程退出时被OS删除?我只是想知道main()返回后在contructor中分配的100MB meory会发生什么的细节。如果有人能告诉我这是值得赞赏的,也谢谢。
答案 0 :(得分:2)
程序退出后,操作系统将回收所有已用内存,无论是否已调用删除。
其他资源(如套接字)可能需要更长时间才能被操作系统释放,但最终会被回收。
答案 1 :(得分:1)
这取决于操作系统。
但是,当应用程序消失时,您认为会消失的内容往往比您想象的更长时间留在内存中。在某些时候,main中的代码被移动到一个被调用一次的函数。然后多次调用该函数。然后你有泄漏。首先是防御性的编码,而不是以后解决问题。也许多年后。
答案 2 :(得分:0)
析构函数未被调用,因为您没有删除 B类指针。 此外,在您的应用程序退出后,无论您是否已发布,所有已分配的资源都会被释放。
答案 3 :(得分:0)
与其他答案一样,它取决于操作系统。
话虽如此,但通常会记录在程序终止时清理的内容。
这通常包括应用程序的私有内存,文件,套接字,资源句柄,GUI资源,并且可以排除许多应用程序的全局或共享资源。 (例如,如果您不调用shm_unlink
,则POSIX共享内存将一直存在,直到重新启动。)