【发布时间】:2016-12-28 15:08:08
【问题描述】:
我只知道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';
}
上面的代码“不太好”,因为在调用getptr() 之前没有现有的shared_ptr。所以好的应该是:
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 对象具有相同的控制块,这样我们就可以避免the double-delete problem。但是如果我必须在开始时提醒自己创建一个shared_ptr,为什么我不提醒自己使用shared_ptr 对象来创建一个新对象,而不是使用原始指针呢?
【问题讨论】:
-
void f(Good& g); /* ... */ f(*gp1); /* ... */ void f(Good& g) { /* now what? */ } -
@milleniumbug 对不起,我不明白你想说什么。
-
f无权访问shared_ptr,因为它需要一个引用,而不是共享指针。有时您可以进行更改,以便改为使用引用,但不适用于成员函数 -this始终是原始指针。 -
@milleniumbug 我想你误解了我的问题。我的问题是:使用
std::enable_shared_from_this并不能让我们免于双重删除的风险。如果是这样,std::enable_shared_from_this就没用了。查看示例:ideone.com/FlvIWw -
你错了。
std::enable_shared_from_this不应该是防止滥用shared_ptr界面的保护措施。有关它的用例,请参阅我的答案。
标签: c++ shared-ptr smart-pointers enable-shared-from-this