我可以为局部变量创建boost :: shared_ptr吗?

Grz*_*nio 6 c++ boost shared-ptr

我有一些方法可以引用给定的对象,有些方法正在采用boost::shared_ptr.到目前为止,在我的测试方法中,我创建了一个shared_ptr指向其中一个对象并传递*ptr给期望引用的方法.是否有可能以相反的方式进行,例如在堆栈上创建一个本地对象,然后以安全的方式创建一个指向它的共享指针,以便&obj用传统指针直接替代运算符?

Dav*_*rtz 14

如果您发现需要这个,那么您的代码可能会出现严重错误.

如果函数采用共享指针,那应该是因为它们需要延长对象的生命周期.如果他们不需要延长对象的生命周期,他们应该参考.

通过你正在做的事情,他们无法延长对象的生命周期.如果他们需要,也不能,他们可能会通过您传递的共享指针的副本来访问超出范围的对象.繁荣.

这可能有点意义.它们可能需要延长寿命,但是您将确保对象保持有效的时间长于它们可能需要延长的最长时间.但我仍强烈建议不要这样做.它非常脆弱,使您调用的所有代码完全依赖于调用代码的行为方式.


Igo*_* R. 10

#include <boost/shared_ptr.hpp>

void null_deleter(int *)
{}

int main()
{
    int i = 0;
    boost::shared_ptr<int> p(&i, &null_deleter);
}
Run Code Online (Sandbox Code Playgroud)


thi*_*ton 6

您可以在表单的构造函数中传递适当的删除器:

template<class Y, class D> shared_ptr(Y * p, D d);
Run Code Online (Sandbox Code Playgroud)

删除对象必须在其中执行任何操作operator()(),例如函数:

template <typename T>
void no_op(T*) {}
Run Code Online (Sandbox Code Playgroud)

然后你可以用它构建:

boost::shared_ptr<Foo> f(&obj, no_op<Foo>);
Run Code Online (Sandbox Code Playgroud)