gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:16:53 26 4
gpt4 key购买 nike

我刚知道std::enable_shared_from_this表格 this link .
但是看了下面的代码,不知道什么时候用。

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';
}

上面的代码“不太好”,因为不存在 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();

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

在我看来,使用 std::enable_shared_from_this是为了确保不止一个shared_ptr对象具有相同的控制 block ,因此我们可以避免 the double-delete problem .但如果我必须提醒自己创建一个 shared_ptr一开始,我为什么不提醒自己使用 shared_ptr对象来创建一个新对象,而不是使用原始指针?

最佳答案

关于何时 std::enable_shared_from_this<T> 的提示有用之处就在于它的名字:当根据某些请求生成对象时,可能需要返回指向对象本身的指针。如果结果应该是 std::shared_ptr<T>有必要从通常没有 std::shared_ptr<T> 的成员函数中返回这样的指针。可访问。

源自std::enable_shared_from_this<T>提供了一种获取 std::shared_ptr<T> 的方法只给定一个 T 类型的指针.然而,这样做确实假设该对象已经通过 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();
// ...
}

在现实场景中,可能存在某种情况下 std::shared_ptr<T>返回当前对象。

关于c++ - 我们什么时候应该使用 std::enable_shared_from_this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41364700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com