我有一些函数需要使用std::shared_ptr作为参数,因此我被迫使用std::shared_ptr,但是我要传递给函数的对象并非动态分配。我该如何将对象包装在std::shared_ptr中,并使std::shared_ptr不调用其上的delete操作。
我有一些函数需要使用std::shared_ptr作为参数,因此我被迫使用std::shared_ptr,但是我要传递给函数的对象并非动态分配。我该如何将对象包装在std::shared_ptr中,并使std::shared_ptr不调用其上的delete操作。
MyType t;
nasty_function(std::shared_ptr<MyType>(&t, [](MyType*){}));
在创建共享指针时,可以指定一个空操作的删除器,例如:
void null_deleter(MyType *) {}
int main()
{
MyType t;
nasty_function(std::shared_ptr<MyType>(&t, &null_deleter));
}
nasty_function(boost::shared_ptr<MyType> (boost::shared_ptr<MyType>(), &t));
。 - radkeshared_ptr
? - curiousguynull_deleter
的函数对象,专门用于此目的。来自文档的示例:头文件
<boost/core/null_deleter.hpp>
定义了boost::null_deleter
函数对象,它可以作为智能指针(如unique_ptr
或shared_ptr
)的删除器使用。该删除器在解除分配时不会对所提供的指针执行任何操作,这使得它在指向的对象在其他地方被释放时非常有用。
std::shared_ptr< std::ostream > make_stream()
{
return std::shared_ptr< std::ostream >(&std::cout, boost::null_deleter());
}
我只是在寻找一个解决方案,看到了这个问题。什么都没找到,于是我自己写了一个很棒的代码。
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)>
作为自定义删除器。使用lambda表达式,你可以自由地运行并做任何想做的事情。
A a;
shared_ptr<A> pa(&a);
foo(pa);
new (&pa) shared_ptr<A>(); // pa "forgets" about a
std::shared_ptr
和boost::shared_ptr
几乎是相同的。 - Angew is no longer proud of SOshared_ptr
。在某个地方存储该引用时使该对象失效将会带来不好的后果。如果该函数不存储引用,则不应接受拥有指针类型。 - CaseyFILE *
这样的东西,这种类型可以通过fopen
等方式进行管理,也可以不进行管理(例如stdin
),而且你有一个类使用了这个对象,超出了创建它的调用(例如创建解析器或记录器)。在这种情况下,你将希望使用“不执行任何操作”的删除器来传递 stdin,但对于已经通过fopen
打开的文件,则需要使用fclose
删除器。 - reeceshared_ptr<ostream>
。我可能有一个函数,它接收一个 ostream 并将其作为 shared pointer 存储以备后用。现在假设我想输出到std::cout
。我无法删除std::cout
,但我可以保证它的存在至少与我的函数保持 shared pointer 的时间一样长。 - Cort Ammon