【问题标题】:How can I make `new[]` default-initialize the array of primitive types?如何使`new []`默认初始化原始类型数组?
【发布时间】:2011-01-28 22:04:03
【问题描述】:

我需要不时调用new[] 来获取内置类型(通常是char)。结果是一个包含未初始化值的数组,我必须使用memset()std::fill() 来初始化元素。

如何让new[]默认初始化元素?

【问题讨论】:

标签: c++ arrays initialization


【解决方案1】:

int* p = new int[10]() 应该可以。

但是,作为Michael points out,使用std::vector 会更好。

【讨论】:

  • 也可以c++11统一初始化语法:new int[10]{}.
  • @Fernando:现在可以了,感谢您指出这一点。不过,您很难找到一个在 2010 年 5 月接受它的编译器。 :)
【解决方案2】:

你为什么不直接使用 std::vector 呢?它会自动为您执行此操作。

std::vector x(100); // 100 个整数,值为 0 std::vector y(100,5); // 100 个整数,值为 5

还需要注意的是,使用向量更好,因为数据会被可靠地破坏。如果你有一个new[] 语句,然后随后抛出异常,分配的数据将被泄露。如果使用 std::vector,则将调用向量的析构函数,从而正确释放数据。

【讨论】:

  • 我完全同意vector通常更好,但我仍然想要new[]。无论如何 +1。
【解决方案3】:

这个相对古老的主题现在可以通过另一个变体来增强。 我使用的是 bool,因为 vector<bool> 有一个非常奇怪的专业化

#include <memory>
...
unique_ptr<bool[]> p{ new bool[count] {false} };

现在可以使用operator[] 访问它

p[0] = true;

就像std::vector&lt;T&gt; 一样,这是异常安全的。

(我想这在 2010 年是不可能的 :))

【讨论】:

    猜你喜欢
    • 2012-03-02
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 2018-08-09
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多