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

时间:2015-11-10 06:41:19

标签: c++ boost mutex shared-ptr

假设我有一个带有资源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();

1 个答案:

答案 0 :(得分:1)

在你的场景中,B是A的成员。当A被破坏时,它将被销毁(并且free()将被调用)。无需显式通话。

但是在您的代码中,并不能保证您的pointer.reset()已分配的A对象被销毁:如果pointer是唯一指向此shared_ptr的{​​{1}},它就会被销毁对象,即自创建以来没有指针的副本(这里没有证据,但要在实际代码中检查)。

顺便说一下,您的代码中缺少t.join()