- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在尝试理解从 enable_shared_from_this
继承的有用性,尽管那里对这种机制的工作原理做了一些解释。我在 post 上找不到这个问题的答案所以我把它贴在这里。
在其中一个例子中。以下示例作为不良做法给出。我理解原因是两个共享指针彼此不认识,一旦其中一个共享指针超出范围,资源将被销毁。
struct S
{
shared_ptr<S> dangerous()
{
return shared_ptr<S>(this); // don't do this!
}
};
int main()
{
shared_ptr<S> sp1(new S);
shared_ptr<S> sp2 = sp1->dangerous();
return 0;
}
我的问题是为什么用户不这样做
shared_ptr<S> sp2 = sp1;
那不也只会增加引用计数吗?会好吗?是否给出了该示例以防万一该类无法访问 sp1 并且需要返回一个 shared_ptr
?
最佳答案
核心问题在于,出于某种原因,并非代码库中的每个共享指针都为其余代码“已知”。
如果您有权访问已给定的 shared_ptr
你应该总是使用 shared_ptr<S> sp2 = sp1;
正如你所写的。使用 std::enable_shared_from_this
绝对好而且更好.
让我们举个例子:
struct S: std::enable_shared_from_this<S>
{
std::shared_ptr<S> getPtr() { return shared_from_this(); }
};
// Here we have no interface for providing a shared_ptr, maybe
// code that we can't change or maintain or comes as callback from
// a library we want to use
void f( S* s )
{
// here we have no access to shared_ptr<S>...
// so we need to have access to the unique counting instance
// of all other shared_ptr which are pointing to this object
std::shared_ptr<S> p3 = s->getPtr();
std::cout << p3.use_count() << std::endl;
// do some stuff....
}
int main()
{
std::shared_ptr<S> p1 = std::make_shared<S>();
std::cout << p1.use_count() << std::endl;
// This example is useless, as you can directly use p1
std::shared_ptr<S> p2 = p1->getPtr();
std::cout << p1.use_count() << std::endl;
std::cout << p2.use_count() << std::endl;
// But if we have to use a interface, which is not providing access via shared_ptr like this:
f(p1.get());
}
这里解决的关键问题是简单地访问连接我们系统 IF 中所有其他 shared_ptr 的公共(public)“句柄”!我们根本无权访问任何 shared_ptr!
我们无法访问我们对象的任何现有 shared_ptr 的原因可能有很多,例如:使用只允许原始指针的旧接口(interface),但我们想在我们的其余代码中使用共享 ptr,使用回调来自也只支持原始指针等的库。
使用 std::enable_shared_from_this<S>
有一些缺点:
你的接口(interface)不能使用const S*
不再,就像创建一个新的 shared_ptr
将修改std::enable_shared_from_this
的数据现在是您的类或结构的基类。它还会增加对象的大小。
关于c++ - enable_shared_from_this<S> 什么时候有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56585977/
类中使用shared_ptr()的问题 当我们先定义一个指针,然后再用这个指针构造两个智能指针 int main() { int* pt = new int(); std::shared_
我有两个类A和B,其中B是A的子类。我需要两个类都可以使用std::enable_shared_from_this。 我尝试了这个: #include #include #include cla
我正在尝试在模板函数中使用 std::enabled_shared_from_this 函数,但在类中调用 shared_from_this() 时不断收到消息 bad_weak_ptr 错误。 te
我有以下类结构用于管理具有不同原型(prototype)的回调: class MethodHandlerBase: public std::enable_shared_from_this{ publi
我的类继承自多个基类,其中之一是 std::enable_shared_from_this .必须是第一垒吗? 假设以下示例代码: struct A { ~A(); }; struct B { ~B(
我找到的关于 enable_shared_from_this 的例子显示它通过继承使用。例如: struct Good : enable_shared_from_this { shared_p
在公开继承 enable_shared_from_this 并初始化类的对象后,在调用该类的另一个函数时,我在 Visual Studio 中调试时仍然可以看到 enable_shared_from_
我在阅读 Boost.Asio 示例时遇到了 enable_shared_from_this,在阅读了文档之后,我仍然不知道如何正确使用它。有人可以给我一个例子和解释什么时候使用这个类是有意义的。 最
这个问题在这里已经有了答案: What is the usefulness of `enable_shared_from_this`? (6 个答案) 关闭 8 年前。 我正在查看 shared_p
当我继承std::enable_shared_from_this,但是我创建了一个unique_ptr,std::enable_shared_from_this里面的weak_ptr也会被初始化吗当我
这个问题在这里已经有了答案: What is the usefulness of `enable_shared_from_this`? (6 个答案) 关闭 6 年前。 我是 C++11 的新手,我
我有一个对象 (Z),它派生自另外两个对象(A 和 B)。 A 和 B 都派生自 enable_shared_from_this<> ,分别enable_shared_from_this和 enabl
有没有办法阻止 shared_from_this() 调用堆栈分配的对象? 基类列表中的 enable_shared_from_this<> 是类用户的强指标,但有没有办法强制正确使用? 示例代码:
为什么我应该使用 enable_shared_from_this 因为我也可以通过简单的赋值获得相同的效果。 struct A : std::enable_shared_from_this { std
我正在使用 enable_shared_from_this然后从 Base 继承.尝试使用 shared_from_this() 时在 Derived的构造函数(不是初始化列表),我得到一个异常。原来
我有一个继承自 enable_shared_from_this 的类型,以及从该类型继承的另一种类型。现在我不能使用 shared_from_this 方法,因为它返回基类型,并且在特定的派生类方法中
我在阅读 Boost.Asio 示例时遇到了 enable_shared_from_this,在阅读了文档之后,我仍然不知道应该如何正确使用它。有人可以给我一个例子和解释什么时候使用这个类是有意义的。
要点回顾 继承自 std::enable_shared_from_this<T> 的类能够在其自身实例中通过 std::shared_from_this 方法创建一个指向自己的
这个问题在这里已经有了答案: Double inheritance of enable_shared_from_this (3 个回答) 1年前关闭。 当我尝试运行此代码时,我得到 bad_weak_
我不知道这个问题是否适合 SO,但我们开始了: 启用 shared_from_this 时,是否会增加可执行文件的大小?解决 shared_from_this() 调用是否也需要太多时间? 查看文档,
我是一名优秀的程序员,十分优秀!