非常奇怪的问题,如下
struct MyType
{
public:
int i;
void* operator new(size_t size,void *p,int i)
{
((MyType*)p)->i = i;
return p;
}
};
int main( )
{
struct MyType ss;
struct MyType *pss2= new (&ss,20) MyType();
cout<<ss.i<<" "<<pss2->i;
struct MyType *pss3= new (&ss,30) MyType;
cout<<ss.i<<" "<<pss3->i;
}
按道理红色部分过程应该是一样的,都是先调用operator new然后调用编译器自动生成的默认构造函数。
但是编译出来 第一个输出0,0,第二个输出30,30.
也就是说带括号的版本会在operator new后会将对象的内存清0,而后一个则不会,因此后一个才能输出30,而前一个写入的20被清零了。
这个问题很奇怪,不知是何原因。
同样类似问题
struct MyType t1;
struct MyType t2 = MyType();
上面的t1中的i 没有被初始化,是一个随机值,而下面的t2是MyType()生成的一个临时对象的拷贝,按道理编译器默认生成的构造函数是不会初始化成员变量的(因此t1中的成员i 没有初始化),但是t2中的i 成员却被清0了。
相当疑惑ing