读书人

C++ 内存储器泄露

发布时间: 2013-04-21 21:18:07 作者: rapoo

C++ 内存泄露
本帖最后由 HandanXiaoliang 于 2013-04-15 10:16:44 编辑

#include "stdafx.h"
#include <process.h>
class CThreadTest
{
public:
CThreadTest()
{
WaitForSingleObject((HANDLE)_beginthreadex(NULL,0,ThreadFunc,this,0,NULL),INFINITE);
}
~CThreadTest()
{
//位置1
if(m_pUrl)
{
delete m_pUrl;
m_pUrl = NULL;
}
}
char** GetChar(){return &m_pUrl;}
static UINT WINAPI ThreadFunc(PVOID v_pParam)
{
CThreadTest* pTHread = (CThreadTest*)v_pParam;
if(pTHread == NULL)
return 0;

char** pchr = pTHread->GetChar();
*pchr = new char[MAX_PATH];

//位置2
//if(*pchr)
//{
//delete *pchr;
//*pchr = NULL;
//}
return 0;
}
private:
char* m_pUrl;
};

int _tmain(int argc, _TCHAR* argv[])
{
//{
CThreadTest test;
// }
// 包内存溢出
_CrtDumpMemoryLeaks();

return 0;
}


两个问题啊
1、在CThreadTest 类中的线程内部释放动态申请的内存,内存不会泄露,但是在类的析构函数里释放,会有内存泄露呢?
2、如果在main函数里把CThreadTest test加上大括号,不管在线程内部还是析构里,都不会有内存泄露;不加大括号,在类的析构里释放,就会有内存泄露
可是,这都是为啥 内存溢出 C++
[解决办法]
因为如果不加大括号, test 对象的析构是在 _CrtDumpMemoryLeaks 函数运行完了之后去了. 执行 _CrtDumpMemoryLeaks 的时候, 析构函数还没有执行, 内存就没有释放.
[解决办法]
引用:
因为如果不加大括号, test 对象的析构是在 _CrtDumpMemoryLeaks 函数运行完了之后去了. 执行 _CrtDumpMemoryLeaks 的时候, 析构函数还没有执行, 内存就没有释放.

楼上正解,主要是注意 _CrtDumpMemoryLeaks函数的的意思,它检查的是当前的内存泄露,也就是说当它执行时,
所有未销毁的对象均会报内存泄漏。
[解决办法]
_CrtDumpMemoryLeaks()这个函数应该在程序的最后调用 .
你上面的程序就这是在程序的最后面调用的. test的生存期还没有结束.你的析构函数没有执行.
int _tmain(int argc, _TCHAR* argv[])
{
//{
CThreadTest test;
// }
// 包内存溢出
_CrtDumpMemoryLeaks();

return 0;
}


而你这样写的话,我估计是这个原因,

{
CThreadTest test;
}
// 包内存溢出

这个test对象的生存 期是在{}之内.

读书人网 >C++

热点推荐