最近遇到个BUG,是placement new中类成员变量默认值的问题,placement new是不会执行默认初始化的,只有new出来的会执行默认初始化。
数据类型 | 默认值 |
---|---|
基本数据类型整形 | 0 |
基本数据类型浮点类 | 0.0 |
基本数据类型字符型 | ‘\u0000’ |
引用数据类型(指针,类,接口) | null |
#include <iostream>
using namespace std;
class A
{
public:
int a;
A() {}
};
int main()
{
cout << "栈空间类成员变量开始" << endl;
A a1;
cout << a1.a << endl;
A a2;
cout << a2.a << endl;
A a3;
cout << a3.a << endl;
A a4;
cout << a4.a << endl;
cout << "栈空间类成员变量结束" << endl;
cout << "const栈空间类成员变量开始" << endl;
const A ca1;
cout << ca1.a << endl;
const A ca2;
cout << ca2.a << endl;
const A ca3;
cout << ca3.a << endl;
const A ca4;
cout << ca4.a << endl;
cout << "const栈空间类成员变量结束" << endl;
cout << "new堆空间类成员变量开始" << endl;
A* pa1 = new A();
cout << pa1->a << endl;
A* pa2 = new A();
cout << pa2->a << endl;
A* pa3 = new A();
cout << pa3->a << endl;
A* pa4 = new A();
cout << pa4->a << endl;
cout << "new堆空间类成员变量结束" << endl;
cout << "栈空间数组类成员变量开始" << endl;
A arr[4];
for (int i = 0; i < 4; ++i)
{
cout << arr[i].a << endl;
}
cout << "栈空间数组类成员变量结束" << endl;
cout << "placement new栈空间数组类成员变量开始" << endl;
A* pla1 = new (&arr[0]) A();
cout << pla1->a << endl;
A* pla2 = new (&arr[1]) A();
cout << pla2->a << endl;
A* pla3 = new (&arr[2]) A();
cout << pla3->a << endl;
A* pla4 = new (&arr[3]) A();
cout << pla4->a << endl;
cout << "placement new栈空间数组类成员变量结束" << endl;
return 0;
}
结果如下:
栈空间类成员变量开始
0
72703
0
4200080
栈空间类成员变量结束
const栈空间类成员变量开始
0
1
0
4210120
const栈空间类成员变量结束
new堆空间类成员变量开始
0
0
0
0
new堆空间类成员变量结束
栈空间数组类成员变量开始
-1430795808
32765
1
0
栈空间数组类成员变量结束
placement new栈空间数组类成员变量开始
-1430795808
32765
1
0
placement new栈空间数组类成员变量结束