我看过一个类,它是这样定义的类。
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/