【问题标题】:How to instantiate a global smart pointer variable?如何实例化全局智能指针变量?
【发布时间】:2013-11-08 19:47:02
【问题描述】:

如何实例化

unique_ptr<int[]> sums;

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

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

错误 C2247: 'std::default_delete<_ty>::operator ()' 不可访问 因为 'std::unique_ptr>' 使用 'private' 继承自 'std::_Unique_ptr_base<_ty>'

【问题讨论】:

    标签: c++ smart-pointers


    【解决方案1】:

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

    如果你说

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

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

    如果你说

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

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

    正如 dauphic 的回答所说,您要查找的函数称为 reset

    sums.reset(new int[n]);
    

    (您可能想知道为什么存在像函数调用运算符这样愚蠢的东西。它可以让您创建an object that can be called like a function, but passed around like a value.

    【讨论】:

    • 我没有意识到它可能是你在第一个代码 sn-p 中的构造函数调用。我只是认为它只是一种表达智能指针的方式。
    【解决方案2】:

    您正在尝试调用sums,就好像它是一个函数,但事实并非如此。 std::unique_ptr 的内部结构使错误消息令人困惑/误导。

    如果你想初始化sums指向的东西,你应该使用reset函数。

    sums.reset(new int[n]);
    

    【讨论】:

    • 啊,对。有没有一种简单的方法可以将数组的所有单元格设置为某个默认值?
    • 可以使用std::fill来填充数组,但最好使用std::vector而不是C数组。
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2021-11-11
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多