unique_ptr with deleter

时间:2013-03-04 09:28:47

标签: c++ smart-pointers unique-ptr

我正在尝试将std::unique_ptr与删除器一起使用。这是我的代码:

template<class T>
struct Deleter
{
    void operator()(T* p) 
    {
        delete[] p;
    }
};

void Test()
{
    vector<unique_ptr<char>> v;

    for(size_t i = 0; i < 5; ++i)
    {
        char* p = new char[10];
        sprintf(p, "string %d", i);
        v.push_back( unique_ptr<char, Deleter<char>>(p) );  // error is here
    }
}
  

错误C2664:'void std :: vector&lt; _Ty&gt; :: push_back(std :: unique_ptr&amp;&amp;)':无法从'std :: unique_ptr&lt; _Ty,_Dx&gt;'转换参数1到'std :: unique_ptr&lt; _Ty&gt; &安培;&安培;'

编译器:VC ++ 2012.我该如何解决这个问题?我的目标是将unique_ptr用于调用delete[]而非默认delete的自定义删除工具。

2 个答案:

答案 0 :(得分:8)

没有必要,因为unique_ptr已经知道了数组!

std::unique_ptr<char[]> p(new char[10]);
sprintf(p.get(), "...");

数组专门化甚至可以为您提供类似于数组的访问,例如p[0] = 'a';等。

您的矢量类型必须匹配,当然:std:vector<std::unique_ptr<char[]>>

答案 1 :(得分:4)

unique_ptr<char>unique_ptr<char, Deleter<char>>是两种不同的类型。因此,您应该将矢量声明为:

vector<unique_ptr<char, Deleter<char>>> v;