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

Posted

技术标签:

【中文标题】使用正在进行的函数调用销毁对象【英文标题】:Destroying an object with ongoing function call 【发布时间】:2015-11-10 06:41:19 【问题描述】:

假设我有资源 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】:

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

但是,在您的代码中,不能保证您的 pointer.reset() 分配的 A 对象被销毁:只有当 pointer 是唯一指向该对象的 shared_ptr 时,它才会被销毁,即没有复制指针自创建以来(这里没有证据,但要在您的真实代码中检查)。

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

【讨论】:

以上是关于使用正在进行的函数调用销毁对象的主要内容,如果未能解决你的问题,请参考以下文章

调用具有条件变量等待的线程对象的析构函数时会发生啥?

静态对象成员会在所属类的析构函数被调用时自动析构吗?

在破坏调用期间从另一个线程未定义的行为调用对象上的方法?

面向对象3

c++析构函数

c++析构函数