如何实例化全局智能指针变量?

时间:2013-11-08 19:47:02

标签: c++ smart-pointers

如何实例化

unique_ptr<int[]> sums;

int main(int argc, char** argv)
{
    int n = //get from args
    sums(new int[n]);
}

?它给了我以下编译时错误

  

错误C2247:'std :: default_delete&lt; _Ty&gt; :: operator()'无法访问   因为'std :: unique_ptr&gt;'使用   'private'继承自'std :: _ Unique_ptr_base&lt; _Ty,_Dx,true&gt;'

2 个答案:

答案 0 :(得分:3)

您试图调用sums,就像它是一个函数一样,它不是。 std::unique_ptr的内部使错误消息混淆/误导。

如果要初始化sums指向的内容,则应使用reset函数。

sums.reset(new int[n]);

答案 1 :(得分:3)

看起来您可能对C ++的构造函数调用语法感到困惑。

如果你说

unique_ptr<int[]> sums(new int[n]);

构造一个名为sums的新对象,使用指向int数组的指针调用构造函数。

如果你说

unique_ptr<int[]> sums;
sums(new int[n]);

它在第一行使用0参数构造函数构造sums,然后在第二行尝试在unique_ptr<int[]>::operator()(int*)对象上调用sums(即函数调用运算符)。这不存在,这会给你错误。

正如dauphic的回答所说,您正在寻找的功能称为reset

sums.reset(new int[n]);

(你可能想知道为什么某些东西如函数调用操作符那么愚蠢。它可以让你创建an object that can be called like a function, but passed around like a value.