使用正在进行的函数调用销毁对象
Destroying an object with ongoing function call
假设我有 class A 和资源 B。Class A 有一个函数在我想销毁它之前不获取互斥锁。我调用 boost::shared_ptr::reset() 来销毁 class 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();
在您的场景中,B 是 A 的成员。当 A 被销毁时,它将被销毁(并且 free()
将被调用)。无需显式调用。
但是在您的代码中,无法保证您的 pointer.reset()
分配的 A 对象会被销毁:只有当 pointer
是唯一指向该对象的 shared_ptr
时,它才会被销毁,即自指针创建以来没有复制指针(这里没有证据,但要在您的真实代码中检查)。
顺便说一下,您的代码中缺少 t.join()
。
假设我有 class A 和资源 B。Class A 有一个函数在我想销毁它之前不获取互斥锁。我调用 boost::shared_ptr::reset() 来销毁 class 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();
在您的场景中,B 是 A 的成员。当 A 被销毁时,它将被销毁(并且 free()
将被调用)。无需显式调用。
但是在您的代码中,无法保证您的 pointer.reset()
分配的 A 对象会被销毁:只有当 pointer
是唯一指向该对象的 shared_ptr
时,它才会被销毁,即自指针创建以来没有复制指针(这里没有证据,但要在您的真实代码中检查)。
顺便说一下,您的代码中缺少 t.join()
。