【发布时间】:2012-07-16 12:28:24
【问题描述】:
我遇到了问题,我的应用程序有一个无限增长的内存泄漏,没有被检测到。我所做的非常简化,是创建一个对象,在其上运行一个方法,然后删除该对象。每次我这样做时,TaskManager 中的内存使用量都会增加大约 50-100MB。一些跑步后,这耗尽了我的全部记忆。我通过多线程来做到这一点,但是没有静态变量,所以我的线程中的不同对象之间没有冲突。它们只使用其他对象的静态方法,除了传入参数之外不会修改任何其他内存——因此它是线程安全的。 我试图找出原因:
- 使用 crtdbg.h (CRT-Memeory-Leak-Detection),但只有在我的应用程序启动后才存在泄漏 - 它们会在关机时被删除,而且不会那么大。
- 我一直在我继承的所有对象中寻找虚拟析构函数,但它们都可以
我还能尝试找出我的应用程序泄漏的位置吗?我在 HEAP 中找不到任何泄漏,除了可能导致堆栈泄漏的析构函数问题之外,我不知道任何其他原因(我的意思是对象不会破坏本地 std::string 对象已在堆中分配空间)。我不知道“STACK-Leaks”是否还有其他原因,但我知道在我的方法中,内存增长最多的部分,没有 HEAP 分配。
【问题讨论】:
-
让我们看看创建对象的代码以及你如何处理对象或指向对象的指针
-
Obejct 非常大,所以我无法发布整个代码 - 它由 new 分配并使用 delete 释放 - 你想确切地看到什么 - 每个 new 都有一个 delete 和每个 new[ ] 有一个 delete[] ...
-
如果你只这样做,为什么不在堆栈上创建对象 - 所以不需要 new 和 delete
-
@Mark - 可能是因为 OP 标记了“多线程”
在线程之间通信对象的地方,在堆栈上创建对象可能非常狡猾 - RAII 的诅咒可能会在之前把它吹走它由其他线程处理。 -
在尝试使用任务管理器检测泄漏时要非常小心。 “经过几次跑步,这会耗尽我的全部记忆。” - 发生了什么,你得到一个例外?尝试最小化您的应用并再次恢复它 - 看看会发生什么。
标签: c++ multithreading memory-leaks