gpt4 book ai didi

c++ - enable_shared_from_this 和堆栈上的对象

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

有没有办法阻止 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()
}

最佳答案

因此,为了防止出现此问题,您可以将构造函数设为私有(private)并仅提供返回 shared_ptr 的创建函数 - 这样就无法在堆栈上分配对象,如下所示:

class C : public enable_shared_from_this<C>
{
public:
static shared_ptr<C> create() { return shared_ptr<C>(new C() ); }
shared_ptr<C> method() { shared_from_this(); }

private:
C() {...}

// Make operator= and C(const C&) private unimplemented
// so the used cant do bad things like C c( * c_ptr );
C& operator=( const C & );
C( const C & );
};


void func()
{
C c; // This doesn't compile
shared_ptr<C> ptr = c.method(); // So you can never get this
}

void altfunc()
{
shared_ptr<C> c_ptr = C::create();
C & c_ref = *c;
shared_ptr<C> ptr = c_ref.method(); // OK
}

如果您发现自己想要一个operator=,您可以使用私有(private)实现的复制构造函数提供一个克隆函数,就像这样

// This goes in class C
shared_ptr<C> C::clone() const
{
return shared_ptr<C>( new C(*this) );
}

// This is how you can use it
shared_ptr<C> c2 = c1->clone();

关于c++ - enable_shared_from_this 和堆栈上的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3574019/

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