shared_ptrトラップ

Shared_ptrトラップ分析

注意して裸のポインターを使用する

	int* i1 = new int(100);

	//使用裸指针初始化多个shared_ptr会导致这多个shared_ptr之间没有关联,最终导致多次释放内存
	shared_ptr<int> sp1(i1);
	shared_ptr<int> sp2(i1);

	cout << sp1.use_count() << endl;  //打印1
	cout << sp2.use_count() << endl;  //打印
	//这段程序如果执行完,会出错,如果想要观测打印结果,使用断点调试

get()によって返されたポインタを注意して使用してください

  • get()で削除できないポインター
  • get()によって返されたポインターを他のスマートポインターに関連付けることはできません(1.1の問題を回避するため)

クラス内のこのポインタを他のshared_ptrに直接リンクしないでください

#include <iostream>
using namespace std;

//class A
//{
//public:
//	shared_ptr<A> getPoint()
//	{
//		return shared_ptr<A>(this);  //使用裸指针关联其它shared_ptr指针会导致内存多次释放的问题
//										 //解决办法:继承 enable_shared_from_this 模板
//	}
//};


class A:public enable_shared_from_this<A>
{
public:
	shared_ptr<A> getPoint()
	{
		return shared_from_this();
	}
};


int main()
{
	shared_ptr<A> sp(new A());

	shared_ptr<A> sp1 = sp->getPoint();

	return 0;
}

Shared_ptr循環参照によりメモリリークが発生する

参考ブログ:https : //www.cnblogs.com/douzujun/p/10803365.html

 

追加の提案: make_shared()関数を使用してshared_ptrポインターを作成してみてください

公開された123元の記事 ウォン称賛31 ビュー90000 +

おすすめ

転載: blog.csdn.net/qq_40794602/article/details/99619906