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ポインターを作成してみてください