当前位置:  开发笔记 > 编程语言 > 正文

可变大小的类 - C++

如何解决《可变大小的类-C++》经验,为你挑选了1个好方法。

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

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> Timo Geusch..:

这是一个旧的C技巧,用于处理普通C中不可用的可变长度数组.是的,它也适用于C++,只要你使用合适的分配器结构(比如分配一堆原始内存所需的大小和然后放置在那里新建对象).只要你不在分配的内存的末尾徘徊,它就是安全的,但它确实往往会混淆至少一些内存调试器.

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

然而,我对工厂函数的实现有点怀疑 - 我假设'size'参数实际上是所需的数组大小?另外,不要忘记你必须使用'free'而不是'delete'来释放上面的内存,即使后者在大多数情况下都可以使用.

除非有一个令人信服的理由说明为什么必须以这种方式管理内存,否则我只需用std :: vector替换数组.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有