如果我们不删除内存并且应用程序已退出,是否存在内存泄漏

时间:2014-09-16 14:49:25

标签: c++ memory-leaks

我在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会发生什么的细节。如果有人能告诉我这是值得赞赏的,也谢谢。

4 个答案:

答案 0 :(得分:2)

程序退出后,操作系统将回收所有已用内存,无论是否已调用删除。

其他资源(如套接字)可能需要更长时间才能被操作系统释放,但最终会被回收。

答案 1 :(得分:1)

这取决于操作系统。

但是,当应用程序消失时,您认为会消失的内容往往比您想象的更长时间留在内存中。在某些时候,main中的代码被移动到一个被调用一次的函数。然后多次调用该函数。然后你有泄漏。首先是防御性的编码,而不是以后解决问题。也许多年后。

答案 2 :(得分:0)

析构函数未被调用,因为您没有删除 B类指针。 此外,在您的应用程序退出后,无论您是否已发布,所有已分配的资源都会被释放。

答案 3 :(得分:0)

与其他答案一样,它取决于操作系统。

话虽如此,但通常会记录在程序终止时清理的内容。

这通常包括应用程序的私有内存,文件,套接字,资源句柄,GUI资源,并且可以排除许多应用程序的全局或共享资源。 (例如,如果您不调用shm_unlink,则POSIX共享内存将一直存在,直到重新启动。)