C++类内弹性数组的使用技巧

 
Category: C++
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
}