几个内存泄漏的例子.docVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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)

word.ppt文档 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档