我见过一个类,它是一个像这样定义的类.
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();
所以据我所知,这个函数使用placement new来扩展这个类.
这是安全的,因为只有一个成员,它在堆上分配?
这是一个旧的C技巧,用于处理普通C中不可用的可变长度数组.是的,它也适用于C++,只要你使用合适的分配器结构(比如分配一堆原始内存所需的大小和然后放置在那里新建对象).只要你不在分配的内存的末尾徘徊,它就是安全的,但它确实往往会混淆至少一些内存调试器.
在使用这种技术时,你必须确定的一件事是变量长度数组是对象布局中的最后一个元素,否则你将遍历其他内部变量.
然而,我对工厂函数的实现有点怀疑 - 我假设'size'参数实际上是所需的数组大小?另外,不要忘记你必须使用'free'而不是'delete'来释放上面的内存,即使后者在大多数情况下都可以使用.
除非有一个令人信服的理由说明为什么必须以这种方式管理内存,否则我只需用std :: vector替换数组.