2024年5月11日发(作者:)

几个内存泄漏的例子

 new和delete要成对使用

 new和delete要匹配

经常看到一些C++方面的书籍中这样提及到内存泄漏问题,这样的说法的意思是比较明

白,但对于初学C++程序员还是很难掌握,所以下面举几个反面的例子,希望对大家有帮助。

例一:错误处理流程中的return导致的内存泄漏

bool MyFun()

{

CMyObject* pObj = NULL;

pObj = new CMyObject();

if („)

if(„)

}

if (pObj != NULL)

delete pObj;

return false;

return false;

return true;

注意:红色字体部分的return之前没有释放pObj,导致内存泄漏。

例二:exception改变了程序的正常流程,导致内存泄漏

情况1:

HRESULT MyFun()

{

HRESULT hr = S_OK;

try

{

CMyObject* pObj = NULL;

pObj = new CMyObject();

if („)

{

}

if(„)

{

hr = E_FAIL;

throw hr;

}

hr = E_FAIL;

throw hr;

}

if (pObj != NULL)

delete pObj;

catch (HRESULT& eHr)

{

}

}

return hr;

情况2:

void OtherFun() // 可能是自己写的其他函数;

// 也可能是其他人写的函数;

// 也可能是系统的API;

{

}

if(„)

throw exception;

bool MyFun()

{

CMyObject* pObj = NULL;

pObj = new CMyObject();

OtherFun();

}

if (pObj != NULL)

delete pObj;

return true;

注意:上面的两种情况中的throw行为将导致程序的正常流程,一旦有throw的

动作发生,pObj对象将不会被正确释放(delete)。

例三:忘记释放系统API创建的资源,导致内存泄露

bool CMyClass::MyFun()

{

HANDLE hHandle = CreateEvent(NULL,FALSE,TRUE,NULL);

if („)