再看编译器差异 字符变量的初始化
试想有下面代码:
int main(void) {
char c;
wchar_t wc;
return 0;
}
代码中的两个字符都是未经过初始化 在VC及GCC的编译下面这两者会被填充不同的值 例如
VC c = -57, GCC c = 127
这点倒是可以理解的 但是请再看下面的一段代码
int main()
{
char c;
new (&c) char();
wchar_t wc;
new (&wc) wchar_t();
return 0;
}
令人惊奇的是VC GCC两个编译器下运行 c wc都惊奇的呈现相同的默认值 0
不同的是 我此处使用到了定位new 但按理都和前一个例子一样都调用了wchar和char的同一个构造函数
请问为什么会有这种差别 请问标准C/C++是怎么说的 如何查证
PS: 值得庆幸的是 这个模型至少可以作为消除编译器差异的又一有利工具
[解决办法]
你这个问题与new无关。
char()这种初始化方式叫零初始化,把char的内存布局全用0填充,原因在这。
而局部char c是无初始化,c的内容不确定。
[解决办法]
new有好多种操作, 此处只是其中一种。char c 在堆栈上分配内存,没有操作,值肯定是乱的。
[解决办法]
前面的变量在栈上,它的初始值不确定,在DEBUG版本为了便于调试,会填充特定字符,比如VC的0xCC。
后面的new的用法,没记错应该叫做,inplacement new,会调用构造函数,将空间置0。
[解决办法]
重点是楼主描述问题不清楚,没有说清楚release还是debug模式。 这很关键。