C++ 内存泄漏的处理

16 篇文章 0 订阅

关于C++ 的内存泄漏问题一直是项目后期调试时的拦路虎,特别是项目的深度扩展和迭代,造成大量的内存问题。可以先了解下C++内存管理:https://www.cnblogs.com/mrlsx/p/5411874.html

1.使用vld

  • 可以比较精准地定位到内存泄漏的程序申请点,方便快速处理问题;
  • 缺点是当项目的new或mallolc调度深度太大时,直接无法检测到内存泄漏,小项目可以,大项目不推荐用
  • 关于VLD的安装和使用请参考:https://blog.csdn.net/hust_bochu_xuchao/article/details/79507085

2.使用api函数--推荐

  • 可以检测到项目存在的所有内存泄漏;
  • 缺点是无法像vld那样精准定位到内存泄漏的程序申请点;
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <assert.h>

#ifdef _DEBUG
#	define new DEBUG_CLIENTBLOCK
#endif

#ifdef _DEBUG
#	define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#	define DEBUG_CLIENTBLOCK
#endif

void ExitCheckout()
{
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
	assert(_CrtDumpMemoryLeaks() == 0);
}

#endif /*_MEMORYLEAKCHECK_H__*/
  • _CrtDumpMemoryLeaks():记录此时的内存泄漏情况(实时),尽量把此函数放在程序结束处,但也避免不了它的不可靠性,因此更适合用在MFC的InitInstance里;
  •  真正使用时无法定位"__FILE__","__LINE__"信息,可以直接在程序结束点_CrtDumpMemoryLeaks();
  • 当存在多线程或并行调度new和malloc时,内存泄漏的调度顺序是随机的,此时_CrtSetBreakAlloc(340)无法真正定位到程序申请入口;
  • 如果存在静态成员或全局的内存释放以及多线程的退出机制时,可能会在_CrtDumpMemoryLeaks()之后执行,导致误报-------处理方法:在程序入口处_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);不要用_CrtDumpMemoryLeaks() ;它会在程序终止后自动打印全部内存泄漏的块信息.

3.使用智能指针:https://blog.csdn.net/zhoumin4576/article/details/103716685

  • auto_ptr(C++11已删除),unique_prt,shared_ptr,weak_ptr(弱引用,配合shared_ptr使用);
  • 很多人使用,也用的很好,不过在多线程中使用shared_ptr时,可能存在各种各样的问题
  • 存在一些编程陷阱,并不意味着使用了智能指针就不会存在内存泄漏,建议前期使用时加上内存检测api:_CrtDumpMemoryLeaks()来检测内存泄漏的问题

4.项目实行过程中的几点想法

  • 每个团队必须要有严格的编码规范和审查方式,方便项目对接以及岗位变更后新成员能快速进入项目;
  • 个人项目实施的话直接加上_CrtDumpMemoryLeaks(),编码过程就能处理完所有的内存泄漏问题了;如果是项目管控,而手底下人员又不可控时,建议在架构阶段对new或malloc进行二次封装,可以在程序结束点释放存在内存泄漏的内存块,或者统一编码行为全部使用智能指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值