考虑我有以下结构
:
struct IDirect3D
{
IDirect3D() : ref_count_(0) {}
unsigned long Release() { return --ref_count_; }
private:
long ref_count_;
~IDirect3D() {}
};
我想像下面的代码(最小示例)一样对它使用 shared_ptr
:
int main()
{
boost::shared_ptr<IDirect3D> ptr;
IDirect3D* p = 0; // initialized somewhere
ptr.reset( p, boost::mem_fn( &IDirect3D::Release ) );
return 0;
}
这在大多数情况下都可以正常工作,但如果 p
等于 0
就会出错。我有以下要使用的删除器:
template<typename T, typename D>
inline void SafeDeleter( T*& p, D d )
{
if ( p != NULL ) {
(p->*d)();
p = NULL;
}
}
但下面的代码给出了很多错误(看起来它转储了整个 bind.hpp
):
ptr.reset( p, boost::bind( SafeDeleter, _1, &IDirect3D::Release ) );
我使用 bind
有什么问题?
最佳答案
Release()
来自 IUnknown
- 为什么不直接使用它:
void my_deleter(IUnknown* p) {
// ...
}
ptr.reset(p, &my_deleter);
注意 Boost 也有一个 intrusive_ptr
在这里看起来更自然:
void intrusive_ptr_add_ref(IUnknown* p) { p->AddRef (); }
void intrusive_ptr_release(IUnknown* p) { p->Release(); }
boost::intrusive_ptr<IDirect3D> d3d(...);
IDirect3D* p = 0;
d3d.reset(p);
您的实际问题可能是有一个非模板函数 SafeDeleter
- 要专门使用模板函数,您必须使用类似的东西:
ptr.reset(p, boost::bind(&SafeDeleter<IDirect3D, ULONG (IDirect3D::*)()>,
_1, &IDirect3D::Release));
关于c++ - 绑定(bind)两个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3465268/