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 („)
发布评论