我们什么时候应该使用std :: enable_shared_from_this

Yve*_*ves 11 c++ smart-pointers shared-ptr c++11

我只知道std::enable_shared_from_this形成这个链接.
但在阅读下面的代码后,我不知道何时使用它.

try {
        Good not_so_good;
        std::shared_ptr<Good> gp1 = not_so_good.getptr();
    } catch(std::bad_weak_ptr& e) {
        // undefined behavior (until C++17) and std::bad_weak_ptr thrown (since C++17)
        std::cout << e.what() << '\n';    
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码"不太好",因为shared_ptr在调用之前没有存在getptr().好的应该是:

std::shared_ptr<Good> gp1 = std::make_shared<Good>(); // having a shared_ptr at the beginning
std::shared_ptr<Good> gp2 = gp1->getptr();
Run Code Online (Sandbox Code Playgroud)

但是,如果我已经有了一个shared_ptr对象,为什么我不只是简单地编码:std::shared_ptr<Good> gp2 = gp1;这意味着我根本不需要std::enable_shared_from_this.

在我看来,使用std::enable_shared_from_this是确保多个shared_ptr对象具有相同的控制块,以便我们可以避免双删除问题.但是如果我必须提醒自己shared_ptr在开始时创建一个,为什么我不提醒自己使用shared_ptrobject来创建一个新的,而不是使用原始指针?

Die*_*ühl 6

关于何时std::enable_shared_from_this<T>有用的提示是在其名称中:当根据某些请求产生对象时,可能需要返回指向对象本身的指针.如果结果应该是a std::shared_ptr<T>,则必须从通常无法std::shared_ptr<T>访问的成员函数内返回这样的指针.

派生自std::enable_shared_from_this<T>提供了一种方法来获取std::shared_ptr<T>给定的只是一个类型的指针T.但是,这样做会假设对象已经通过a进行管理,std::shared_ptr<T>如果在堆栈上分配了对象,则会产生混乱:

struct S: std::enable_shared_from_this<S> {
    std::shared_ptr<S> get_object() {
        return this->shared_from_this();
    };
}

int main() {
    std::shared_ptr<S> ptr1 = std::make_shared<S>();
    std::shared_ptr<S> ptr2 = ptr1->get_object();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在实际情况中,可能存在一些条件,在该条件下std::shared_ptr<T>返回当前对象.