2023-03-21-
Introduction
问题
如何解决内存泄漏
内存泄漏分两种,分别不同方法解决:
普通没释放
-
根据原理,我们可以先review自己的代码,利用"查找"功能,查询
new
与delete
,看看内存的申请与释放是不是成对释放的,这使你迅速发现一些逻辑较为简单的内存泄露情况。 -
如果依旧发生内存泄露,可以通过记录申请与释放的对象数目是否一致来判断。在类中追加一个静态变量
static int count;
在构造函数中执行count++;
在析构函数中执行count--;
,通过在程序结束前将所有类析构,之后输出静态变量,看count的值是否为0,如果为0,则问题并非出现在该处,如果不为0,则是该类型对象没有完全释放。 -
检查类中申请的空间是否完全释放,尤其是存在继承父类的情况,看看子类中是否调用了父类的析构函数,有可能会因为子类析构时没有是否父类中申请的内存空间。
-
对于函数中申请的临时空间,认真检查,是否存在提前跳出函数的地方没有释放内存。
shared_ptr循环引用导致引用计数失效
1、智能指针有没有内存泄露的情况?
答:当两个对象同时使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效,从而导致内存泄露。
2、智能指针的内存泄漏如何解决?
答:为了解决循环引用导致的内存泄漏,引入了弱指针weak_ptr,weak_ptr的构造函数不会修改引用计数的值,从而不会对对象的内存进行管理,其类似一个普通指针,但是不会指向引用计数的共享内存,但是可以检测到所管理的对象是否已经被释放,从而避免非法访问。
# 面试题】【C++】请问,使用智能指针有没有内存泄漏的情况?
Reference
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment