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

时间:2013-11-21 21:07:09

标签: c++ c++11 shared-ptr

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

5 个答案:

答案 0 :(得分:38)

MyType t;
nasty_function(std::shared_ptr<MyType>(&t, [](MyType*){}));

答案 1 :(得分:24)

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

void null_deleter(MyType *) {}

int main()
{
  MyType t;
  nasty_function(std::shared_ptr<MyType>(&t, &null_deleter));
}

答案 2 :(得分:15)

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

nasty_function(std::shared_ptr<MyType>(std::shared_ptr<MyType>{}, &t));

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

正如@Casey@Nevin所指出的,只有在您确定该函数不会尝试获取共享所有权时,或者如果该对象将超过可能“拥有的所有内容”时,才应执行此操作“它。

答案 3 :(得分:-1)

你可以做到这一点:

Image

答案 4 :(得分:-1)

我只是在寻找解决方案,看到了这个问题。什么都没找到,做得很好这是我的代码

class HBitmap : public shared_ptr<HBITMAP__>
{
public:
    HBitmap();
    HBitmap(HBITMAP Handle);
    bool autoDelete = true;
};

Win32::HBitmap::HBitmap(HBITMAP Handle)
: shared_ptr<HBITMAP__>(Handle, [&](HBITMAP hBitmap)  {if(autoDelete)DeleteObject(hBitmap);})
{
}

此解决方案是lambda表达式和继承的组合。 非常好。快速。你不能期待更多。您不仅可以设置删除器,而且如果进行了一些修改,则可以使用std::function<void(pointer)>作为自定义删除器。有了lambdas,你可以自由奔跑,做你想做的事。