有如下C++代码:
int* buffer = new int[512];
在默认情况下,new
是不会对分配的int
进行初始化的。要想使分配的int
初始化为0,需要显式地调用其初始化函数:
int* buffer = new int(); // 分配的一个int初始化为0
int* buffer = new int(0); // 分配的一个int初始化为0
int* buffer = new int[512](); // 分配的512个int都初始化为0
对于单个int
,也可以初始化为非0值:
int* buffer = new int(5); // 分配的一个int初始化为5
但是无法将分配的所有元素同时初始化为非0值,以下代码是不合法的:
int* buffer = new int[512](0); // 语法错误!!!
int* buffer = new int[512](5); // 语法错误!!!
C++11
C++11中增加了初始化列表功能,所以也可以使用以下的方式进行初始化:
int* buffer = new int{}; // 初始化为0
int* buffer = new int{0}; // 初始化为0
int* buffer = new int[512]{}; // 512个int都初始化为0
int* buffer = new int{5}; // 初始化为5
与上面不同的是,如下写法是合法的:
int* buffer = new int[512]{5}; // 第一个int初始化为5,其余初始化为0
但是其结果与我们设想的不一样,它并不是将分配的512个int
都初始化为5,而仅仅是将第一个int
初始化为5,其余的511个仍然初始化为0!
而且正如初始化列表中“列表”两字所指出的,我们实际上可以用一个列表来初始化分配的内存:
int* buffer = new int[512]{1, 2, 3, 4}; // 前4个int分别初始化为1、2、3、4,其余int初始化为0
注:以上代码均在Visual Studio 2015 Community Updata3 下测试通过。