智能指针不是解决内存泄漏的万能良药

Posted CodeBowl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能指针不是解决内存泄漏的万能良药相关的知识,希望对你有一定的参考价值。

背景

最近在重构一个模块,模块中的接口有指针参数,我想把他改成智能指针,凡是接口要保持不变,就很难修改。
接口类似func(int ** p1),不知道怎么用shared_ptr代表
然后我就进行了一系列骚操作!
从而也发现了智能指针的不当使用带来的内存泄漏和悬空指针的问题。

内存泄漏

内存泄漏(Memory
Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

悬空指针

在C/C++等语言中,悬空指针(Dangling
Pointer)指的是:一个指针的指向对象已被删除,那么就成了悬空指针。野指针是那些未初始化的指针。

示例1:错误的get()会带来悬空指针

void func(int **p1)
{
	std::Shared_ptr<int> sp=std::make_shared<int>(0);
	*p=sp.get();
}

int main()
{
	int *p1=new int(1);
	func(&p1);  //Error:悬空指针
	delete p1;
}

上面的代码就会出现悬空指针的问题。
原因是,C++的生命周期回收机制,在func()函数的智能指针sp的生命周期随着此函数的结束而结束,sp.get()方法返回的裸指针,所以不会增加引用计数,所以随着func()的结束,p1指向的sp的内存就被释放了,也就成了悬空指针

示例2:智能指针没有初始化

int main()
{
	std::Shared_ptr<int> sp;
	int *p1 = sp.get();
	return 0;
}

错误原因:此时sp没有被初始化过,所以自然也就没有内存,p1也就没有内存!

以上是关于智能指针不是解决内存泄漏的万能良药的主要内容,如果未能解决你的问题,请参考以下文章

智能指针(解决你的内存泄漏)

智能指针(解决你的内存泄漏)

智能指针(解决你的内存泄漏)

C++11标准下的智能指针

C++智能指针

查找由智能指针引起的内存泄漏