Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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++ 从_this和析构函数提升共享__C++_Boost_Shared Ptr_Object Lifetime_Weak Ptr - Fatal编程技术网

C++ 从_this和析构函数提升共享_

C++ 从_this和析构函数提升共享_,c++,boost,shared-ptr,object-lifetime,weak-ptr,C++,Boost,Shared Ptr,Object Lifetime,Weak Ptr,我发现不允许从类的析构函数中调用共享的\u: 这种行为是故意的。由于析构函数将销毁该对象,因此为其创建一个共享的\u ptr是不安全的,因为一旦析构函数结束,该对象将悬空 我理解这个论点,但是如果我需要一个“shared\u from\u this”指针来清理引用(而不是共享所有者身份),该怎么办呢 下面是一个示例,我没有使用shared_ptr: class A{ public: A( Manager * m ) : m_(m) { m_->add(this);

我发现不允许从类的析构函数中调用共享的\u:

这种行为是故意的。由于析构函数将销毁该对象,因此为其创建一个共享的\u ptr是不安全的,因为一旦析构函数结束,该对象将悬空

我理解这个论点,但是如果我需要一个“shared\u from\u this”指针来清理引用(而不是共享所有者身份),该怎么办呢

下面是一个示例,我没有使用shared_ptr:

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

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

private:
    Manager * m_;
};
在这里,我尝试将其转换为共享指针。但我找不到完成析构函数的好方法:

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() {
        m_->add(shared_from_this());
    }

    Manager * m_;
};
class A:public boost::从\u this启用\u共享\u{
公众:
typedef boost::shared_ptrptr;
静态Ptr创建(管理器*m){
Ptr p(新A(m));
p->init();
返回p;
}
~A(){
//不工作
//m_u->remove(shared_from_this());
}
私人:
A(经理*m):m(经理){}
void init(){
m_u->添加(从_this()共享的_);
}
经理*m;
};

如何实现上面示例中的析构函数?

如果您的管理器对您的对象有一个
共享的\u ptr
,那么它就拥有它。 因此,您的对象不会被破坏,因为管理者仍然对其有引用

您可以将弱指针传递给管理器,但管理器的工作是检查指针是否仍然有效,如果无效,则将其删除

你的问题很有趣,但你的案例是由误解引起的。只要一个对象拥有对您的对象的引用,shared_ptr的目标就是它不会被破坏。对于要调用的析构函数,您应该在指针上手动调用delete,这在使用shared_ptr时是一种不良行为


简单地定义谁真正拥有对象,并给他们共享的ptr。如果代码的一部分偶尔需要您的对象(如果它存在的话),那么给它一个弱的\u ptr。

如果Manager实例对您的类有一个共享的\u ptr,那么在共享的\u ptr消失之前,您的类永远不会被销毁。因此,我假设Manager实际上正在将一个弱ptr存储到您的实例中,在这种情况下,Manager的API可能会接受一个弱ptr,您应该能够在析构函数中获得该弱ptr。如果不能,只需在构造函数中创建一个,并将其存储以备将来使用

在这里,我尝试将其转换为共享指针

不要

您的第一个类很好(除了它是隐式声明的复制构造函数和复制赋值-与原始指针的使用无关)

为什么要用智能指针呢?因为它很时髦

弱\u ptr
经常被误解为类似指针的类(不是,它是弱引用)

弱\u ptr
很少适用。(即使使用Boost文档,也会混淆
弱ptr
何时合适。)


enable\u shared\u from\u此
更容易被误解。

通过设计,弱ptr可以让对象被销毁。因此,对于拥有弱ptr的对象来说,检查其有效性是非常重要的。但无论如何,这是一个很好的解决方案。只是尝试为您指出的有点误解的问题提供一些选项,因为我们不应该在析构函数中从某个包含共享ptr的内容中注销我们自己。您好。“一个你应该能在析构函数中得到的弱ptr”——你能解释一下,我怎样才能在析构函数中得到弱ptr吗
enable_shared_from_this
只包含
shared_from_this
,而不是
weak_from_this
。@hate engine终于在C++17中支持
weak_from_this
。@rWools您将如何使用它?我想创建新的标记:滥用weak ptr对已启用的共享的误解