shared_ptrのとメモリリークを避けるためにどのように?
-
11-09-2019 - |
質問
次のコードを考えてみます。
using boost::shared_ptr;
struct B;
struct A{
~A() { std::cout << "~A" << std::endl; }
shared_ptr<B> b;
};
struct B {
~B() { std::cout << "~B" << std::endl; }
shared_ptr<A> a;
};
int main() {
shared_ptr<A> a (new A);
shared_ptr<B> b (new B);
a->b = b;
b->a = a;
return 0;
}
があるの出力はありませんの。 のんdesctructor が呼び出されません。メモリーリーク。 私はいつもスマートポインタは、メモリリークを回避するのに役立ちますと信じています。
私はクラスで相互参照が必要な場合は、私は何をすべきでしょうか?
解決
あなたはこのような循環参照を持っている場合は、
、一つの目的は、<のhref =「http://www.boost.org/doc/libs/1_41_0/libs/smart_ptr/weak_ptr.htm」のrel =「noreferrer」を開催しなければなりません>他のではなく、weak_ptr
にshared_ptr
でます。
実装は参照カウントを使用するので、、
shared_ptr
インスタンスのサイクルは再生できません。main()
は、直接的または間接的にshared_ptr
に戻すA
を保持しているshared_ptr
するA
を、保持している場合たとえば、A
の使用回数は、1使用shared_ptr
を「ブレークの使用回数にぶら下がっA
を残す元weak_ptr
の2破壊になりますサイクル。 "
のおかげで、グレン、リンクについて。の
所属していません StackOverflow