情况:
关闭课程时,我看到增加了大约120k字节, 因此,当我关闭几次,几次内存增加 - 我需要找出造成这种情况的原因。
正在寻找有关如何找出vstudio 2010未释放/发布内容的任何好的提示或技巧 - 任何想法?
这里更清楚我做了什么(非常简化)
class cSomeClass
{
cSomeClass();
~cSomeClass();
int Initialize();
void Deinitialize();
}
cSomeClass cCamera;
main()
{
Sleep(10000);
// Do Init / Deinit to find out if we are freeing the memory
while(1)
{
// Init camera
if(cCamera.Initialize()==0)
{
// Rest for a while
Sleep(1500);
cCamera.Deinitialize();
// Rest for a while
Sleep(1500);
}
}
}
我刚刚做了一个小应用程序来初始化/取消类对象来查看 在'任务管理器'中如果我的应用程序的内存返回到它的起始值 - 但事实并非如此,它每次初始化cSomeClass时都会继续递增 - 所以我相信我有一些已初始化但未在Deinitialize中释放的内容。 / p>
更新
我不认为这是一个简单的内存增长,当应用程序启动时它会在10秒后稳定自己,然后说:1MB的ram然后当while(1)踢出每个Initialize i调用时我得到+ 120kBytes应用程序内存(在任务管理器中检查)。
更新
感谢乍得 - 让它嗅到了
_CrtDumpMemoryLeaks
Detected memory leaks!
Dumping objects ->
{76} normal block at 0x003F4BC8, 32 bytes long.
Data: <Logitech QuickCa> 4C 6F 67 69 74 65 63 68 20 51 75 69 63 6B 43 61
{75} normal block at 0x003F4B80, 8 bytes long.
Data: < K? > 20 4B 3F 00 00 00 00 00
{74} normal block at 0x003F4B20, 32 bytes long.
Data: < K? K? > 80 4B 3F 00 C8 4B 3F 00 CD CD CD CD CD CD CD CD
{70} normal block at 0x003F4A30, 8 bytes long.
Data: < )i > 0C 29 69 00 00 00 00 00
Object dump complete.
答案 0 :(得分:3)
最直接的方法是使用Windows API函数进行内存使用情况跟踪,例如_CrtDumpMemoryLeaks。
在追踪顽固的泄漏时,将此与_CrtMemCheckpoint结合使用可能非常重要。
如果您使用的是MFC,您可以选择定义DEBUG_NEW
,这会为全局new
/ delete
运算符添加额外的跟踪功能,为每个泄漏的分配提供文件和行号,这也非常有用,但它不适用于new的一些实现(例如std :: nothrow)。
答案 1 :(得分:0)
我不确定“关闭课程”究竟是什么意思,但是如果你能够在Linux中运行你的代码,那么valgrind始终是跟踪内存泄漏的绝佳选择。 Purify在Windows中运行良好,但它是$$。
另一种方法是尝试预先解决问题:使用智能指针而不是原始指针。
最后确保你实际上看到了泄漏而不仅仅是内存增长达到某个平台。