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

Bia*_*Cao 2 c++ initialization new-operator unique-ptr c++11

如题

#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;
}
Run Code Online (Sandbox Code Playgroud)

有什么不同?我试过两个输出都是零。

另外关于智能指针,如何确保它可以零初始化。

std::unique_ptr<int[]> p = std::make_unique<int[]>(100);
Run Code Online (Sandbox Code Playgroud)

son*_*yao 6

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

  • 否则,什么都不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定的值。

new int[100]()执行值初始化,因为所有元素都将被零初始化0

3) 如果T是数组类型,则对数组的每个元素进行值初始化

4) 否则,对象是零初始化的

编辑

std::make_unique 采用第二种方式进行初始化。

2) 构造一个未知边界的数组T。如果T是未知边界的数组,则此重载仅参与重载决议。该函数等效于:

unique_ptr<T>(new typename std::remove_extent<T>::type[size]())
Run Code Online (Sandbox Code Playgroud)

PS:std::make_unique_for_overwrite采用第一种方式。

5) 与 (2) 相同,除了数组是默认初始化的。如果T是未知边界的数组,则此重载仅参与重载决议。该函数等效于:

unique_ptr<T>(new typename std::remove_extent<T>::type[size])
Run Code Online (Sandbox Code Playgroud)