我看过一个类,它是这样定义的类。

class StringChild : public StringBase
    {
public:
    //some non-virtual functions
    static StringChild* CreateMe(int size);
private:
    unsigned char iBuf[1];
    };

静态工厂功能具有以下实现。
return new(malloc(__builtin_offsetof(StringChild ,iBuf[size]))) StringChild();

据我了解,该函数正在使用new放置来扩展此类。

仅因为只有1个成员并且在堆上分配了它,这是否安全?

最佳答案

这是一个古老的C技巧,用于解决普通C中可变长度数组的不可用问题。是的,只要您使用合适的分配器构造(例如,分配所需大小的原始内存和然后在其中放置新对象)。只要您不徘徊在已分配内存的末尾,它是安全的,但它的确会使至少一些内存调试器感到困惑。

使用此技术时,您必须绝对确定的一件事是,可变长度数组是对象布局中的最后一个元素,否则,您将遍历其他内部变量。

但是我对工厂功能的实现有些怀疑-我假设'size'参数实际上是所需的数组大小?另外,不要忘记您必须使用“free”释放上面的内存,而不是“delete”,即使后者在大多数情况下也可以工作。

除非有令人信服的理由说明为什么必须以这种方式管理内存,否则我将简单地用std::vector替换数组。

关于c++ - 可变大小的类-C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/427761/

10-13 08:34