我有把std :: shared_ptr作为参数的函数,所以我被迫使用std :: shared_ptr,但我传递给函数的对象没有动态分配。如何在std :: shared_ptr中包装对象并让std :: shared_ptr不调用delete。
答案 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,你可以自由奔跑,做你想做的事。