Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用正在进行的函数调用销毁对象_C++_Boost_Mutex_Shared Ptr - Fatal编程技术网

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

C++ 使用正在进行的函数调用销毁对象,c++,boost,mutex,shared-ptr,C++,Boost,Mutex,Shared Ptr,假设我有一个类A和资源B。类A有一个函数,在我想要销毁互斥锁之前,它不会获取互斥锁。我调用boost::shared_ptr::reset()来销毁类A的实例。资源B保证在那个时候销毁吗 class Resource{ public: Resource(){ } ~Resource(){ free(); } void init() {} void free() {} }; class A{ public: A(){ B.init(); } ~

假设我有一个类A和资源B。类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);
}

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

但是,在您的代码中,无法保证您的
指针.reset()
分配的对象会被销毁:只有当
指针
是指向此对象的唯一
共享\u ptr
时,它才会被销毁,也就是说,指针自创建以来没有复制过(这里没有这方面的证据,但需要在您的真实代码中进行检查)

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

pointer->freeB();
pointer.reset();