假设我有一个带有资源B的A类.A类有一个在我想要销毁它之前没有获得互斥锁的函数。我调用boost :: shared_ptr :: reset()来销毁类A的实例。资源B是否保证在那时被销毁?
class Resource{
public:
Resource(){ }
~Resource(){ free(); }
void init() {}
void free() {}
};
class A{
public:
A(){ B.init(); }
~A(){}
void functionC(){
boost::lock_guard<boost::mutex> lock(Mutex);
// Stuck forever
boost::lock_guard<boost::mutex> lock2(Mutex);
}
private:
boost::mutex Mutex;
Resource B;
};
main(){
boost::shared_ptr<A> pointer(new A());
// Do a function call that gets stuck but allows main thread to continue
boost::thread t(boost::bind(&A::functionC, *pointer));
pointer.reset();
// Loop forever
while(1);
}
具体来说,我希望在调用pointer.reset()的位置调用函数B :: free()。这段代码是保证这样做的,还是我必须在某处明确地调用它?显然,我不想像
一样明确pointer->freeB();
pointer.reset();
答案 0 :(得分:1)
在你的场景中,B是A的成员。当A被破坏时,它将被销毁(并且free()
将被调用)。无需显式通话。
但是在您的代码中,并不能保证您的pointer.reset()
已分配的A对象被销毁:如果pointer
是唯一指向此shared_ptr
的{{1}},它就会被销毁对象,即自创建以来没有指针的副本(这里没有证据,但要在实际代码中检查)。
顺便说一下,您的代码中缺少t.join()
。