gpt4 book ai didi

c++ - 使用 new 动态分配字符是否需要编译器将它们初始化为零

转载 作者:太空狗 更新时间:2023-10-29 23:46:43 25 4
gpt4 key购买 nike

例如:

char *p=new char[100];

必须根据 C++ 标准将 p 指向的字符数组初始化为零吗?或者,这种行为是否完全依赖于编译器?

gcc 似乎在每个字符上调用默认构造函数,这当然会将它们初始化为零。 Visual C++ 2010 没有。

最佳答案

不,POD 类型在由 new 创建时未初始化。如果需要,您可以将它们值初始化为零:

char * p = new char[100]();
^^

这是由标准规定的:

C++11, 5.3.4/15: If the new-initializer is omitted, the object is default-initialized (8.5); if no initialization is performed, the object has indeterminate value.

8.5/6: To default-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
— if T is an array type, each element is default-initialized;
— otherwise, no initialization is performed.

你的其他观察:

gcc seems to call the default constructor on each character

它不应该这样做 - 特别是因为 char 没有构造函数。如果您将其替换为具有默认构造函数的类型,那么为每个元素调用。

我得到以下反汇编,没有任何初始化的迹象:

int main() {
char * p = new char[100];
return p[0];
}

00000000004005f4 <main>:
# set up stack frame
push %rbp
mov %rsp,%rbp
sub $0x10,%rsp

# call `operator new[]` with an argument of 100
mov $0x64,%edi
callq 4004e0 <operator new[](unsigned long)@plt>

# put the return value into %eax
mov %rax,-0x8(%rbp)
mov -0x8(%rbp),%rax
movzbl (%rax),%eax
movsbl %al,%eax

# return
leaveq
retq

关于c++ - 使用 new 动态分配字符是否需要编译器将它们初始化为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9502810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com