shared_ptrの。安全性と利便性のメモリ管理を改善するために、++ポインタCスマートポインタ。パワフルなだけでなく、次の質問に注意を払います:
1、それに割り当てられた通常のポインタを使用することはできません
int* pIntValue = new int;
shared_ptr<int> shPtr= pIntValue; // 语法错误
shPtr = pIntValue; // 语法错误
同じデータに2、shared_ptrの複数の参照は、二度同じメモリの解放につながります。
int* pIntArr = new int[10];
shared_ptr<int> sp1(pIntArr );
shared_ptr<int> sp2(pIntArr );// 析构时两次释放同一内存
3、このパッケージを持ってshared_ptrのポインタを使用して。
エラーの練習:
class Test
{
public:
Test() {};
~Test() {};
public:
shared_ptr<Test> sget()
{
return shared_ptr<Test>(this);
}
};
Test one;
shared_ptr<Test> two= one.sget();// 两次释放t对象破坏堆栈
// 两次释放one对象破坏堆栈!!!!!
// 两次释放one对象破坏堆栈!!!!!
// 两次释放one对象破坏堆栈!!!!!
グッドプラクティス:
class Test: public enable_shared_from_this<Test>
{
public:
Test() {};
~Test() {};
public:
shared_ptr<Test> sget()
{
return shared_from_this();
}
};
Test one;
shared_ptr<Test> two= one.sget();// 正确了。
図4は、メモリリーク循環参照をshared_ptrの。
class father;
class son;
typedef shared_ptr<father> father_ptr;
typedef shared_ptr<son> son_ptr;
class father
{
public:
~father() {}
son_ptr m_son;
};
class son
{
public:
~son() {}
father_ptr m_father;
};
father_ptr f(new father());
son_ptr s(new son);
f->m_father= s;
s->m_son= f;
、参照カウントがカウントS 2も、2はF出口のshared_ptrは0が解除された場合の動作は、1単にカウントで作られ、それはこの場合明らかで、参照カウントは、次いで、Fを引き起こし、0ではないとメモリリークにつながる、メモリへのポイントが解放されませんよ。
5、マルチスレッドプログラムでのshared_ptrの使用。
class Test
{
public:
Test() {}
~Test() {}
// 更多的函数定义…
};
void thread_fun(shared_ptr<Test> sp)
{
// !!!在这大量使用sp指针.
shared_ptr<Test> tmp = sp;
}
shared_ptr<Test> sp1(new Test);
thread t1(bind(&fun, sp1));
thread t2(bind(&fun, sp1));
t1.join();
t2.join();
スマートポインタへのアクセス、およびその他の同様のスマートポインタに割り当てからマルチスレッドので、2つのスレッドが参照カウントを操作しながら、その障害または無効なカウントなどの場合に発生する可能性があります。
クラスのweak_ptrを使用するには、複数のスレッドの問題を解決することができます。
void fun(weak_ptr<Test> wp)
{
shared_ptr<Test> sp = wp.lock;
if (sp)
{
// 在这里可以安全的使用sp指针.
}
else
{
// 指针无效
}
}