- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
几个内存泄漏的例子
new和delete要成对使用
new和delete要匹配
经常看到一些C++方面的书籍中这样提及到内存泄漏问题,这样的说法的意思是比较明白,但对于初学C++程序员还是很难掌握,所以下面举几个反面的例子,希望对大家有帮助。
例一:错误处理流程中的return导致的内存泄漏
bool MyFun()
{
CMyObject* pObj = NULL;
pObj = new CMyObject();
…
if (…)
return false;
…
if(…)
return false;
…
if (pObj != NULL)
delete pObj;
return true;
}
注意:红色字体部分的return之前没有释放pObj,导致内存泄漏。
例二:exception改变了程序的正常流程,导致内存泄漏
情况1:
HRESULT MyFun()
{
HRESULT hr = S_OK;
try
{
CMyObject* pObj = NULL;
pObj = new CMyObject();
…
if (…)
{
hr = E_FAIL;
throw hr;
}
…
if(…)
{
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 (…)
return false;
…
return true;
}
注意:系统API CreateEvent创建的HANDLE对象,需要自己释放,否则会导致内存泄漏。还有其他一些系统的API也是如此,如:CreateFile、CreateFileMapping等等,所以我们在使用不熟悉的系统API时,一定要仔细阅读MSDN。
例四:PostMessage可能导致的内存泄漏
// 自定义的消息结构体
typedef struct tagMSG
{
int i;
float f;
}MSG;
// 发送消息的函数
void MyFun()
{
MSG* pMsg = new MSG;
…
PostMessage(m_hWnd, WM_MYEVENT, (WPARAM)pMsg, 0);
}
// 接收消息的函数
afx_msg void OnMessage(WPARAM wParam, LPARAM lParam)
{
MSG* pMsg = (MSG*)wParam;
m_i = pMsg-i;
m_f = pMsg-f;
}
注意:OnMessage函数中忘记释放pMsg,导致内存泄漏。
例五:函数返回new的对象而导致的内存泄漏
char* MyFun()
{
char* p = new char[10];
…
return p;
}
注意:调用MyFun程序的人可能不会注意到MyFun函数内部new出的对象,往往会忽略对象p的释放。
例六:不好的类结构也会导致内存泄漏
// MyClass.h文件
class MyClass
{
public:
MyClass();
virtual ~MyClass();
BOOL Init();
BOOL UnInit();
private:
char* m_pStr;
}
// MyClass.cpp文件
MyClass::MyClass()
: m_pStr(NULL)
{
}
MyClass::~MyClass()
{
}
BOOL MyClass::Init()
{
m_pS
文档评论(0)