std :: shared_ptr传递deletor

时间:2013-09-05 09:46:38

标签: c++ shared-ptr

我有这段代码:

// util.h
#include <memory>

template <class T>
class ArrayDeleter {
public:
    void operator () (T* d) const
    { delete [] d; }
};

std::shared_ptr<char, ArrayDeleter<char> > V8StringToChar(v8::Handle<v8::String> str);
std::shared_ptr<char, ArrayDeleter<char> > V8StringToChar(v8::Local<v8::Value> val);

它给了我错误:

 c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\memory
  (1418) : see declaration of 'std::tr1::shared_ptr'c:\cef\appjs_final\appjs\src\includes\util.h(27): 
error C2977: 'std::tr1::shared_ptr' : too many template arguments 
 [C:\CEF\appjs_final\appjs\build\appjs.vcxproj]

1 个答案:

答案 0 :(得分:6)

unique_ptr不同,删除器不是类模板参数。删除器与使用计数一起存储在单独的对象中,因此 type erasure 可用于使指针对象本身与删除器类型无关。

有一些构造函数模板允许您使用任何合适的函子类型初始化指针。所以你的功能就是

std::shared_ptr<char> V8StringToChar(Whatever);

他们将使用合适的删除器

创建指针
return std::shared_ptr<char>(array, ArrayDeleter<char>());