代码之家  ›  专栏  ›  技术社区  ›  stanigator

对使用new而不是realloc分配的内存有效的realloc函数

  •  1
  • stanigator  · 技术社区  · 16 年前

    我知道 realloc 允许我调整内存块大小的函数(它与一个自由函数配对)。但是,我尝试对C++类做同样的事情,一些成员指针使用内存分配。 新的 而不是 雷洛克 . 是否有等价的关键字 雷洛克 在C++中,当使用新的/Delphi而不是MALOC或ReloLc和FILL配对时,允许我实现相同的目标。

    事先谢谢。

    5 回复  |  直到 11 年前
        1
  •  3
  •   anon    16 年前

    不,没有。坦率地说,如果您使用的是新的或新的[]。你的C++代码可能设计得不好。看使用 STD::载体 而不是new[],以及at使用值而不是new。

        2
  •  2
  •   Khaled Alshaya    16 年前

    我不知道是否有一个,但您可以使用向量,因为您只是调整元素数组的大小:)

    std::vector<char> iVector(1000); // 1000 element as initial size
    
    iVector.resize(2500); // resize the vector to 2500 elements
    
    // or just use it without worrying about memory management
    
        3
  •  2
  •   paercebal    16 年前

    如果我理解您的问题,那么您有一个分配一些可变长度内存的类。有两种可能的情况:

    内存包含C++对象

    您没有选择:应该直接或间接地用new分配内存,因为您需要调用构造函数。

    如果你想有一个真正的行为,那么不要使用新的。而是使用std::vector,它将正确处理所有分配/重新分配/自由和构造/破坏。

    内存是原始的

    您可以使用新的[]或malloc,因为您正在分配pods(一组int或short、dumb结构等)。

    但是,新的[]不会给你一个真正的行为…但是,如果您开始使用malloc,那么您必须进行内务管理,即确保在正确的时间自由调用,在某个地方记住数组的大小,甚至可能具有不同于数组容量的大小(即分配更多,以避免执行过多的重新分配)。

    你知道吗?Vector已经为您做了所有这些。

    结论

    您在C++中编码,那么您的问题的解决方案(即在一个类内分配可变长度内存),正如前面的答案已经表示的那样。 使用STD::向量 .

        4
  •  0
  •   PerGN    11 年前

    看看Vector如何使用Placement New来初始化、复制(移动)和销毁内存中的对象,这些对象在原则上是“重新分配”的。在实现向量之类的东西方面有相当多的工作,所以我想简单地说使用向量…它为所有对象使用一个连续的内存块,因此您可以将它与期望数组的函数一起使用。而且,它隐式地为您跟踪对象的数量…

    当然,这种方便带来了成本——它在后台的堆上分配内存。 因此,如果您完全知道您只需要一个大小合理的数组,那么堆栈上的数组就不会因为速度而被击败。

    溴 每

        5
  •  -3
  •   stepancheg    16 年前

    不,只要使用malloc/realloc/free,有什么问题吗?