使用正在进行的函数调用销毁对象

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()