C ++:在没有cstdlib的情况下重新分配内存

时间:2013-04-19 23:27:09

标签: c++ dynamic-memory-allocation

无法找到问题的确切答案:

释放内存并再次分配重新分配内存而不使用cstdlib的唯一方法?如果不是这样,那么可能的解决方案是什么?

提前致谢。

2 个答案:

答案 0 :(得分:1)

也许你的意思就像用内存加载std :: vector(或其他容器)时所做的那样,删除所有元素,然后调用clear释放内存,然后在其中分配新项,从而分配更多的记忆?在这种情况下,随着容器中的内存增长,容器可以根据需要重新分配其内存。

因为你提到你正在创建一个Vector:

在我们需要执行此操作的项目中,因为我们没有矢量实现(嵌入式),所以通常会分配一大块内存,大于为防止常量内存重新分配所需的内存大小,从而导致大量复制成本并导致内存碎片。一个常见的方案是为app分配一个“合理”的大小,然后在达到限制时加倍。如果用户曾要求缓冲区的大小减小,或者在初始化时设置为大小,那么我们将忽略此启发式并使用请求的大小。

答案 1 :(得分:1)

如果要实现自己的向量类,那么确实需要正确复制向量的内容,而不是使用realloc,因为在复制对象时你不知道对象本身在做什么(或在C ++ 11中针对相关案例,移动)。想象一下,例如你有一个像这样的对象:

class B;

class A
{
  private:
    B* bp;
  public:
    A(B *p) : bp(p)
    {
    }
};


class B
{
  public:
   A a;
   B() : A(this)
   {
      ... 
   }
 };

MyVector<B> v; 

如果将对象复制到其他地址而不调用构造函数,bp中的A指针将指向某个“随机”位置。试图找到这将是一个非常讨厌的错误。

[是的,上面的课程中缺少一些东西 - 它不是一个完整的类声明,等等]