new的初始化

有如下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 下测试通过。

### Go语言 `new` 关键字的用法和初始化过程 #### 创建指针类型的零实例 在Go语言中,`new(T)` 函数用于创建类型T的一个新的零实例,返回指向该实例的指针。对于任何类型的参数T, `new(T)` 返回的是一个 \*T 类型[^1]。 ```go p := new(int) // p 的类型是 *int,它指向一个 int 型的零(即0) fmt.Printf("%d %v\n", *p, p) // 输出: 0 &{0} ``` #### 结构体类型初始化 当使用 `new` 来初始化结构体时,只会为其分配内存空间将所有字段设置为对应的零。如果结构体内含有指针成员,则这些指针会被设为空(nil),这可能导致未定义行为或程序崩溃,除非后续对其进行适当赋。 ```go type TestStruct struct { A *int64 } func main() { ts := new(TestStruct) var value int64 = 10 ts.A = &value // 需要显式地给A赋才能正常使用 fmt.Println(*ts.A) // 正常输出10 } ``` #### 数组、切片、映射表以及通道的区别对待 得注意的是,在处理像 slice (动态数组), map (哈希表) 或 channel 这样的复合数据类型时,仅靠 `new()` 不足以完成完整的初始化工作;因为它们本质上是由底层实现细节构成的数据结构,因此需要通过内置函数 `make()` 来正确构建其内部状态以便于实际应用。 ```go // 错误示范:尝试直接访问由 'new' 分配但未经 make 处理过的 slice/map/channel 可能引发 panic s := new([]string) // s 是 *[]string 类型 m := new(map[string]int)// m 是 *map[string]int 类型 c := new(chan bool) // c 是 *chan bool 类型 // 应改为如下方式使用 make 对上述对象做进一步初始化 *s = []string{"hello"} *m = map[string]int{"one": 1} *c = make(chan bool) // 现在可以安全操作这三个变量了... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值