【问题标题】:Memory allocation for _M_start and _M_finish in a vector向量中 _M_start 和 _M_finish 的内存分配
【发布时间】:2010-02-11 10:59:02
【问题描述】:

我将向量定义为:

vector< int, MyAlloc< int> > *v = new vector< int, MyAllooc< int> > (4);

MyAlloc 只为 4 个整数分配空间。 _M_start、_M_finish 和 _M_end_of_storage 的内存在 4 个整数的内存之前在堆上分配。但是谁在为 _M_start、_M_finish 和 _M_end_of_storage 分配此内存?我想自己分配这个内存。我该怎么办?

【问题讨论】:

    标签: c++ memory stl vector


    【解决方案1】:

    不要使用new 来分配向量。通常你应该从栈中分配向量:

    vector< int, MyAlloc< int> > v(4);
    

    如果您也确实需要为此使用自己的分配器,请为对象分配内存,然后在其上调用placement new 来构造向量。

    也可以重载全局操作符new/delete,但是这样真的很乱,不推荐。

    【讨论】:

    • 我必须在堆上分配向量。即使我要使用placement new,问题仍然存在。 _M_start、_M_finish 等的内存从何而来;因为即便如此,我也只会在放置池中放置 4x4=16(假设 int 为 4 字节)字节。
    • 下定决心!您是要自己分配内存(问题)还是要使用堆内存(评论)?这两个选项实际上是相互排斥的。
    • 我在这里提到的那段代码是在一个 C 程序使用的静态 C++ 库中。我想自己分配内存。碰巧这个内存最终是通过 malloc 调用从 c 堆中来的。
    【解决方案2】:

    分配器分配容器的数据存储,而不是正常分配的容器数据成员。必须是这种情况,否则您将无法使用 new 或在堆栈上创建向量。这对于像列表这样的基于节点的容器来说是最清楚的 - 列表节点由分配器分配,但其他数据成员,包括指向第一个和最后一个节点的指针(如果以这种方式实现)是正常分配的。

    【讨论】:

    • 你说的有道理,但请看我对上一篇文章的回复。 (MSalters 的帖子。)
    【解决方案3】:

    当您创建向量时,它会为向量的成员变量(_M 变量)分配空间无论您放置向量的任何位置。如果您使用new,它会在堆上为这些变量分配空间。对于局部变量,编译器在当前堆栈帧中为它们腾出空间。如果将向量设为类的成员,编译器会在包含的类中为它们腾出空间。

    向量然后使用它的分配器为您希望存储在向量中的数据分配空间,使用分配器定义使用的任何机制。

    【讨论】:

    • 这和我看到的一致。我是否正确理解 (_M's) 的空间是由 MyAlloc 之外的“新”分配的?我问这个问题的原因是,尽管有任何数量的打印语句,但我无法弄清楚 MyAlloc 为 _M 分配空间的位置。如果 _M 的空间是由“new”而不是 MyAlloc 分配的,那么我该如何控制这个空间分配?
    • 是的,MyAlloc 只是一个帮助对象,vector 可以在它喜欢的时候调用它。 new 不知道分配器,它只是为向量分配空间。您“控制”成员变量的分配,就像我在回答中所说的那样:通过将它们分配到您想要的位置。如果您使用new 分配向量,则向量的成员将分配到new 决定的任何位置(在堆上)。如果将向量设为类成员,则其所有成员都将作为该类的一部分进行分配。如果您使用新展示位置,它们会被分配到您想要的任何位置。
    【解决方案4】:

    new T 在堆上分配sizeof(T) 内存。在您的情况下,Tstd::vector&lt; int, MyAlloc&lt; int&gt; &gt; 并包括像 _M_start 这样的成员。

    如果您想自己分配该内存,请不要调用new

    【讨论】:

    • 有趣的是 sizeof(*v) 给出了 12,这是 M_start、_M_finish 和 _M_end_of_storage 的空间。我可以从 MyAlloc 中的 allocate 函数看到它只分配 16 个字节 - 刚好够 int 使用,不包括 _M。如果我想在堆上这样做,那么我想我必须使用 new?
    • 那句话的最后一句话根本没有任何意义。 “做这个”指的是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2020-03-11
    相关资源
    最近更新 更多