你怎么使std :: shared_ptr不调用delete()

Ken*_* Li 29 c++ shared-ptr c++11

我有把std :: shared_ptr作为参数的函数,所以我被迫使用std :: shared_ptr,但我传递给函数的对象没有动态分配.如何在std :: shared_ptr中包装对象并让std :: shared_ptr不调用delete.

ron*_*nag 42

MyType t;
nasty_function(std::shared_ptr<MyType>(&t, [](MyType*){}));
Run Code Online (Sandbox Code Playgroud)

  • 注意:您传递shared_ptr的任何函数也可能获取对象的所有权,因此OP需要确保(a)未发生的事件或(b)对象的生命周期长于所有事物的生命周期已经拥有它的所有权. (8认同)
  • @Angew:没有巧合.只是简单的复制和粘贴.演示更多C++ 11ish替代方案. (2认同)

Rei*_*ica 27

创建共享指针时指定no-op删除器.像这样:

void null_deleter(MyType *) {}

int main()
{
  MyType t;
  nasty_function(std::shared_ptr<MyType>(&t, &null_deleter));
}
Run Code Online (Sandbox Code Playgroud)


T.C*_*.C. 19

执行此操作的最佳方法是使用别名构造函数:

nasty_function(std::shared_ptr<MyType>(std::shared_ptr<MyType>{}, &t));
Run Code Online (Sandbox Code Playgroud)

与null删除器方法相比,这不需要分配控制块,并且是noexcept.

正如@Casey@Nevin所指出的那样,只有在您确定该函数不会尝试获取共享所有权时,或者如果该对象比可能"拥有"它的所有内容更长时,才应该这样做.