标题
#include <iostream>
int main() {
auto* a = new float[1000000];
auto* b = new float[10]();
for(auto i=0; i<1000000; i++){
std::cout << "a" << a[i] << std::endl;
}
for(auto i=0; i<10; i++){
std::cout << "b" << b[i] << std::endl;
}
return 0;
}
有什么区别?我试过两个输出均为零。
此外,有关智能指针的内容,如何确保它可以零初始化。
std::unique_ptr<int[]> p = std::make_unique<int[]>(100);
答案 0 :(得分:6)
new int[100]
执行default initialization,所有元素将被初始化为不确定的值。请注意,从它们中读取将导致UB,一切皆有可能。
- 否则,什么也没做:将具有自动存储期限的对象(及其子对象)初始化为不确定的值。
new int[100]()
执行value initialization,因为所有元素的效果将是zero-initialized至0
。
3)如果
T
是数组类型,则数组的每个元素都是value-initialized;4)否则,对象为zero-initialized。
编辑
std::make_unique
采用第二种初始化方式。
2)构造一个未知边界
T
的数组。仅此过载 如果T
是一个未知范围的数组,则参与重载解析。 该功能等效于:unique_ptr<T>(new typename std::remove_extent<T>::type[size]())
PS:std::make_unique_for_overwrite
采用第一种方式。
5)与(2)相同,除了该数组是默认初始化的。这个 仅当
T
是一个数组时,重载才能参与重载解析 未知界限。该功能等效于:unique_ptr<T>(new typename std::remove_extent<T>::type[size])