Introduction

问题

如何解决内存泄漏

参考1
# C++ 怎么检测内存泄露,怎么定位内存泄露?

内存泄漏分两种,分别不同方法解决:

普通没释放

  1. 根据原理,我们可以先review自己的代码,利用"查找"功能,查询newdelete,看看内存的申请与释放是不是成对释放的,这使你迅速发现一些逻辑较为简单的内存泄露情况。

  2. 如果依旧发生内存泄露,可以通过记录申请与释放的对象数目是否一致来判断。在类中追加一个静态变量 static int count;在构造函数中执行count++;在析构函数中执行count--;,通过在程序结束前将所有类析构,之后输出静态变量,看count的值是否为0,如果为0,则问题并非出现在该处,如果不为0,则是该类型对象没有完全释放。

  3. 检查类中申请的空间是否完全释放,尤其是存在继承父类的情况,看看子类中是否调用了父类的析构函数,有可能会因为子类析构时没有是否父类中申请的内存空间。

  4. 对于函数中申请的临时空间,认真检查,是否存在提前跳出函数的地方没有释放内存。

shared_ptr循环引用导致引用计数失效

1、智能指针有没有内存泄露的情况?
答:当两个对象同时使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效,从而导致内存泄露。

2、智能指针的内存泄漏如何解决?
答:为了解决循环引用导致的内存泄漏,引入了弱指针weak_ptr,weak_ptr的构造函数不会修改引用计数的值,从而不会对对象的内存进行管理,其类似一个普通指针,但是不会指向引用计数的共享内存,但是可以检测到所管理的对象是否已经被释放,从而避免非法访问。
# 面试题】【C++】请问,使用智能指针有没有内存泄漏的情况?

Reference