2010-03-18 76 views
19

不时需要拨打电话new[]获取内置类型(通常为char)。结果是一个未初始化值的数组,我必须使用memset()std::fill()来初始化元素。如何使`new []`初始化原始类型的数组?

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

+7

我不确定这是否有效,但在VC9上正常工作。 'int * p = new int [10]();' – Naveen 2010-03-18 07:54:43

回答

25

int* p = new int[10]()应该做的。

但是,由于Michael points out,使用std::vector会更好。

+2

您也可以使用C++ 11统一初始化语法:'new int [10] {}'。 – 2015-05-22 19:27:09

+2

@Fernando:你现在可以,谢谢你指出这一点。不过,你很难在2010年5月找到一个接受该编译器的编译器。 ':)' – sbi 2015-05-23 06:49:44

22

为什么你不使用std :: vector?它会自动为你做到这一点。

 
std::vector<int> x(100); // 100 ints with value 0 
std::vector<int> y(100,5); // 100 ints with value 5 

重要的是要注意使用矢量更好,因为数据将被可靠地破坏。如果您有一个new[]语句,然后抛出异常,则分配的数据将被泄漏。如果使用std :: vector,则会调用vector的析构函数,导致数据正确释放。

+2

我完全同意vector往往更好,但我仍然想要new []。无论如何。 – sharptooth 2010-03-22 14:57:34

1

这个相对较旧的主题现在可以通过另一个变体进行增强。 我用布尔,因为没有为vector<bool>

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

一个很奇怪的专业化但是现在可以用operator[]

p[0] = true; 

就像std::vector<T>这是异常安全的访问。

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