0

找不到问题的确切答案:

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

提前致谢。

4

2 回答 2

1

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

既然你提到你正在创建一个向量:

在我们需要这样做的项目中,因为我们没有向量实现(嵌入式),通常分配一组比最初需要的更大的内存块,以防止不断的内存重新分配,这会产生大量的复制成本并导致内存碎片化。一个常见的方案是为应用程序分配一个“合理的”大小,然后在达到限制时将该大小加倍。如果用户曾经请求减小缓冲区的大小,或者在初始化时设置为某个大小,那么我们将忽略此启发式并使用请求的大小。

于 2013-04-19T23:31:28.240 回答
1

如果您正在实现自己的向量类,那么您确实需要正确复制向量的内容,而不是 use 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将指向某个“随机”位置。试图找到这将是一个非常讨厌的错误。

[是的,上面的类中缺少很多东西——这并不意味着完整的类声明等]

于 2013-04-19T23:40:35.027 回答