是否可以将新分配的块初始化为0?

时间:2015-07-15 12:42:59

标签: c++ new-operator

我已经阅读过所有关于某些方法的信息,例如:

new int[3] {0 , 0, 0};

在此之后我记得在C中声明初始化数组的方法 我问自己,C++new int[n] {} 执行此操作也是有效的:

0

空的大括号会导致所有内容calloc (n, sizeof(int)); - 初始化。 尝试后它看起来很好,但也可能只是由随机性和真正的UB或其他东西造成的。

如果它有效,是否还有方法来初始化特定值?

注意:

我希望与C++的调用相同。但由于我现在已经C而不是{{1}}了,我不再使用theese函数来保持代码的可读性。

注2:

说话时

  

我想实现[...]

它对应于我的最小例子,我只想获得一个零初始化的有效内存块。

2 个答案:

答案 0 :(得分:4)

auto array = new int[n] ();

这执行零初始化,因为int是“非类型”。

auto array = new int[n];

这不是。初始值是不确定的。请注意,这背后的背景非常混乱,标准中的描述改变了几次,可能是为了减少混淆,IMHO未能实现其效果。因此,一些相关链接:

(也请阅读评论)

  

[...]我只需要一个零初始化内存块,而不是任何向量或数组实现......

std::vector 是一个简单的内存块。用它。除非您使用它们,否则它提供的其他成员函数没有任何成本。如果您不需要,将不会有任何大小调整。使用它的原因与您希望尽可能使用std::unique_ptrstd::shared_ptr原始指针的原因相同!

答案 1 :(得分:1)

我不会使用new operator并使用C ++ STL容器,例如std::vectorstd::array。这是一个小例子,因为你知道编译时的大小:

std::array<int,3> foo{}; // will initialize a std::array with 0 value.

有关初始化的更多解释:

new int[5] ()zero initialization它有效并将元素初始化为0.

  

2)作为非类类型和for的值初始化序列的一部分   没有构造函数的值初始化类类型的成员。

new int[5] default initialization您无法保证,因为这些值是任意填充的。

  

如果T是数组类型,则数组的每个元素都是默认初始化的。