class P {
public:
int x;
int array_[1]; // Must be declared at the end of the class
};
这里就体现了使用 new 和 malloc 的一个不同, 即 new 不能指定所分配的具体内存大小, 只能让编译器根据对象所占内存的大小来推断(计算), 如果非要指定(并且不是通过 array-new 的方式)那就要用 placement-new 方法. 代码如下:
void t1() {
cout << "sizeof(P)=" << sizeof(P) << endl; // 8
// 24=4+5*4, array_.size=5
// auto p = (P*)malloc(24); // definition
P* p = new P;
new (p + sizeof(P)) int[4]; // ASan may check error
p->array_[0] = 1;
p->array_[1] = 2;
p->array_[2] = 3;
p->array_[4] = 3;
for (int i{}; i < 5; ++i)
cout << p->array_[i] << endl;
// 1
// 2
// 3
// -1094795586
// 3
}