new int [100]和new int [100]()之间的区别;

时间:2020-06-05 08:24:43

标签: c++ c++11 initialization new-operator unique-ptr

标题

#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);

1 个答案:

答案 0 :(得分:6)

new int[100]执行default initialization,所有元素将被初始化为不确定的值。请注意,从它们中读取将导致UB,一切皆有可能。

  • 否则,什么也没做:将具有自动存储期限的对象(及其子对象)初始化为不确定的值。

new int[100]()执行value initialization,因为所有元素的效果将是zero-initialized0

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])
相关问题