封装对象并管理其生命周期的最佳方法是什么?例如:我有一个类A,其中包含类型为B的对象,并且是单独负责的。封装对象的生命周期管理
解决方案1 ,克隆b对象,以确保只有一个是能够清理。
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的行为?宣布责任并让其他人阅读文档就足够了吗?这是如何在你的代码库中管理的?
所以,你会改变A的构造函数采取类似shared_ptr包含b? – driAn 2009-01-12 20:24:47
不需要引用计数。如A所述,拥有所有权。 – 2009-01-12 20:37:39