【无标题】

背景介绍

C++语言没有C#那样的垃圾回收机制,即需要开发人员自己去管理内存,包括申请和释放内存。如果内存使用不当,就容易造成内存泄漏(memory leak)或者内存崩溃(memory crash)。

内存泄漏

定义

内存泄漏(memory leak)是指程序中己动态申请的堆内存由于某种原因程序没有进行释放,导致程序运行速度减慢甚至系统崩溃等严重后果。

原因

  1. 没有释放
	class Obj {
	 public:
	   Obj() {
	     buffer_ = new char;
	   }
	   ~Obj(){}
	  private:
	   char *buffer_;
	};
析构函数中要手动释放申请的内存  
   ~Obj(){
			delete buffer;
		}
  1. 不匹配
	class Obj {
	 public:
	   Obj) {
	     buffer_ = new char;
	   }
	   ~Obj(){
			delete buffer;
		}
	  private:
	   char *buffer_;
	};
	
	
	Obj *t = new Obj;
	free(t);
通过free函数释放了内存,但是没有触发Test的析构函数以释放Test的成员变量,从而引起内存泄漏
  1. 少释放
	int main() 
	{
		int *t = new int[10];
		
		delete t;
		return 0;
	}
	delete[] t;
申请了一组内存,但是只释放了首块

避免

  1. 避免在堆上分配
	class Obj {
	public:
		Obj() {
			buffer_ = new char;
			   }
			   ~Obj() {
				   delete buffer_;
			   }
	private:
		char* buffer_;
	};

	int main(int argc, char *argv[])
	{
	    QCoreApplication a(argc, argv);
	
		{
			Obj ob;
		}
	
	    return a.exec();
	}
如果对象可以在栈上进行分配,就在栈上进行分配,一方面栈的效率远高于堆,另一方面内存的申请和释放由编译器自动完成。
  1. 手动释放

    对于malloc函数分配的内存,使用free函数进行释放

    对于new操作符分配的内存,使用delete操作符来进行释放

    对于new[]创建的对象,使用delete[]来进行释放

  2. 使用智能指针:推荐

class Obj {
	public:
		Obj() {
			buffer_ = new char;
			   }
			   ~Obj() {
				   delete buffer_;
			   }
	public:
		void func() {	
			// TODO: 
		}
	private:
		char* buffer_;
	};
	
	int main(int argc, char *argv[])
	{
	    QCoreApplication a(argc, argv);
	
		{
			auto p1 = std::make_unique<Obj>();
			p1->func();
		}
	
	    return a.exec();
	}
定义:所谓智能指针就是采用RAII(资源获取既初始化)机制对普通指针进行的一层封装,自动帮你释放内存。

定位

  1. 工具

    内存泄漏检测工具:umdh
    在这里插入图片描述

内存崩溃

分类

  1. 内存越界

    比如写一块内存区域的时候没有控制好长度,把其他数据值给破坏了

  2. 内存重复释放

    一块内存区域已经被释放,但是因为逻辑问题,再次尝试释放该内存

	int* pTest = new int(100);

   	delete pTest;
	//pTest = nullptr;

    delete pTest;		

调试

查看崩溃时候的调用堆栈
在这里插入图片描述

图新现状

  1. 目前还是用的原始指针(raw pointer)
  2. 新引擎据说已经使用了智能指针

参考资料

C/C++ 内存泄漏-原因、避免以及定位
https://mp.weixin.qq.com/s/3ZIUxS1QtCT5olCYZzw4Qg

C++ 内存崩溃问题应该如何调试?
https://zhuanlan.zhihu.com/p/548793246?utm_medium=social&utm_oi=805143448788303872&utm_psn=1594435166818185216&utm_source=wechat_session

Modern C++ 智能指针详解
https://mp.weixin.qq.com/s?__biz=MzU2MTkwMTE4Nw==&mid=2247496204&idx=1&sn=ef65b47aa971696ada103a638cbcc553&chksm=fc7309e0cb0480f62f7b09be4c4d892fe9a62c1eb594174e08d2f3947ca1cd34f31790110399&scene=21#wechat_redirect

使用umdh.exe 内存泄露分析

https://blog.csdn.net/asiwxy/article/details/124428309

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值