gpt4 book ai didi

c++ - 可变大小类 - C++

转载 作者:太空宇宙 更新时间:2023-11-03 10:22:24 26 4
gpt4 key购买 nike

我见过一个类是这样定义的..

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 来扩展这个类。

仅因为只有 1 个成员并且分配在堆上才安全吗?

最佳答案

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

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

然而,我对工厂函数的实现有点怀疑——我假设“大小”参数实际上是所需的数组大小?另外,请不要忘记您必须使用“释放”而不是“删除”来释放上面的内存,即使后者在大多数情况下可能有效。

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com