相关疑难解决方法(0)

提升shared_from_this和析构函数

我发现不允许在类的析构函数中调用shared_from_this:

https://svn.boost.org/trac/boost/ticket/147

此行为是设计使然。由于析构函数会销毁该对象,因此为它创建一个shared_ptr是不安全的,因为一旦析构函数结束,它就会变得悬空。

我理解这个论点,但是如果我需要一个“shared_from_this”指针来清理引用(而不是共享所有权)怎么办?

这是一个我没有使用shared_ptr的例子:

class A{
public:
    A( Manager * m ) : m_(m) {
        m_->add(this);
    }

    ~A() {
        m_->remove(this);
    }

private:
    Manager * m_;
};
Run Code Online (Sandbox Code Playgroud)

这里我尝试将其翻译为共享指针。但我找不到完成析构函数的好方法:

class A : public boost::enable_shared_from_this< A > {
public:
    typedef boost::shared_ptr< A > Ptr;

    static Ptr create( Manager * m ) {
        Ptr p( new A(m));
        p->init();
        return p;
    }

    ~A() {
        // NON-WORKING
        // m_->remove( shared_from_this() );
    }

private:
    A( Manager * m ) : m_(m) { }

    void init() { …
Run Code Online (Sandbox Code Playgroud)

c++ boost shared-ptr object-lifetime weak-ptr

4
推荐指数
1
解决办法
3167
查看次数

从另一个线程调用shared_from_this但在shared_ptr初始化之后获取bad_weak_ptr

以某种方式p->start()被称为 - shared_from_this抛出bad_weak_ptr.
但正如你所看到的那样,p->start()被称为shared_ptr完全启动之后.

struct A : std::enable_shared_from_this<A> 
{
    std::thread* t = nullptr;
    A() {}
    ~A(){ 
        t->join(); 
        delete t; 
    }
    void f() { 
        try{
            auto p = this->shared_from_this(); 
            std::cout << "p:" << p.get() << "\n";
        } catch(...) { 
            std::cout << "Exception !!!\n"; 
        }
    }
    void start() { 
        t = new std::thread(&A::f,this); 
    }
};
std::shared_ptr<A> create() { 
    A* a = new A();
    std::shared_ptr<A> p(a);
    p->start();
    return p;
}
int main()
{   
    int …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading stl shared-ptr

3
推荐指数
1
解决办法
224
查看次数