enable_shared_from_this 和堆栈上的对象
有没有办法防止对堆栈分配的对象调用shared_from_this()?
该enable_shared_from_this<>基类列表中的内容对于类用户来说是一个强有力的指标,但是有没有办法强制执行正确的用法?
示例代码:
class C : public enable_shared_from_this<C>
{
public:
shared_ptr<C> method() { return shared_from_this(); }
};
void func()
{
C c;
shared_ptr<C> ptr = c.method(); // exception coming from shared_from_this()
}
Is there a way to prevent shared_from_this() call for a stack-allocated object ?
The enable_shared_from_this<> in the base classes list is a strong indicator for class user, but is there a way to enforce the correct usage ?
Example code:
class C : public enable_shared_from_this<C>
{
public:
shared_ptr<C> method() { return shared_from_this(); }
};
void func()
{
C c;
shared_ptr<C> ptr = c.method(); // exception coming from shared_from_this()
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
因此,为了防止这个问题,您可以将构造函数设置为私有,并且只提供返回shared_ptr的创建函数 - 这样就无法在堆栈上分配对象,如下所示:
如果您发现自己希望有一个operator=< /code> 您可以使用私有实现的复制构造函数提供克隆函数,如下所示
So to protect against this problem you can make your constructors private and only provide creation functions that return shared_ptr - this way the object can't be allocated on the stack, like this:
If you find yourself wishing for an
operator=
you can provide a clone function using a private implemented copy constructor, something like this我找到了解决方案。
在 Dune 库中,他们使用堆栈兼容的
enable_shared_from_this
类模板适配。检查原始源代码 此处 或使用快速复制和粘贴来检查我的示例代码清理:
I found the solution.
In Dune library they use stack-compatible
enable_shared_from_this
class template adaptation.Check the original source code here or check my example with the quick copy&paste & cleanup of code: