封装对象和管理其生命周期的最佳方法是什么?示例:我有一个类A,它包含一个B类型的对象并单独负责它。
解决方案 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 的行为,我可以忽略这些问题吗?声明责任并让其他人阅读文档就足够了吗?这是如何在您的代码库中管理的?