我已经阅读过所有关于某些方法的信息,例如:
new int[3] {0 , 0, 0};
在此之后我记得在C
中声明初始化数组的方法
我问自己,C++
在new int[n] {}
执行此操作也是有效的:
0
空的大括号会导致所有内容calloc (n, sizeof(int));
- 初始化。
尝试后它看起来很好,但也可能只是由随机性和真正的UB或其他东西造成的。
如果它有效,是否还有方法来初始化特定值?
注意:
我希望与C++
的调用相同。但由于我现在已经C
而不是{{1}}了,我不再使用theese函数来保持代码的可读性。
注2:
说话时
我想实现[...]
它对应于我的最小例子,我只想获得一个零初始化的有效内存块。
答案 0 :(得分:4)
auto array = new int[n] ();
这执行零初始化,因为int
是“非类型”。
auto array = new int[n];
这不是。初始值是不确定的。请注意,这背后的背景非常混乱,标准中的描述改变了几次,可能是为了减少混淆,IMHO未能实现其效果。因此,一些相关链接:
(也请阅读评论)
[...]我只需要一个零初始化内存块,而不是任何向量或数组实现......
std::vector
是一个简单的内存块。用它。除非您使用它们,否则它提供的其他成员函数没有任何成本。如果您不需要,将不会有任何大小调整。使用它的原因与您希望尽可能使用std::unique_ptr
或std::shared_ptr
原始指针的原因相同!
答案 1 :(得分:1)
我不会使用new operator
并使用C ++ STL容器,例如std::vector
或std::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是数组类型,则数组的每个元素都是默认初始化的。