オブジェクトをカプセル化し、その有効期間を管理するための最良のアプローチは何ですか? 例: タイプBのオブジェクトを含み、それを単独で担当するクラスAがあります。
解決策 1 、 bオブジェクトのクローンを作成して、 Aのみがクリーンアップできるようにします。
class A
{
B *b;
public:
A(B &b)
{
this->b = b.clone();
}
~A()
{
delete b; // safe
}
};
解決策 2、渡されたオブジェクトを直接使用します。ここで二重解放の可能性があります。
class A
{
B *b;
public:
A(B *b)
{
this->b = b;
}
~A()
{
delete b; // unsafe
}
};
私の実際のケースでは、ソリューション #2 が最適です。ただし、文書化されていても、誰かがAの動作を知らない可能性があるため、これは悪いコードと見なされるのではないかと思います。これらのシナリオを考えることができます:
B *myB = new B();
A *myA = new A(myB);
delete myB; // myA contains a wild pointer now
または、
B *myB = new B();
A *firstA = new A(myB);
A *secondA = new A(myB); // bug! double assignment
delete firstA; // deletes myB, secondA contains a wild pointer now
delete secondA; // deletes myB again, double free
A の動作を適切に文書化すれば、これらの問題を無視できますか? 責任を宣言し、ドキュメントを読むのを他の人に任せるだけで十分ですか? これはコードベースでどのように管理されていますか?