【问题标题】:Re-sizing an array with a loop使用循环重新调整数组的大小
【发布时间】:2014-03-17 00:40:29
【问题描述】:

如果我当前的数组太小而无法继续在前面或后面添加值,我会在调用 grow() 时尝试重新调整数组的大小。

void Vector::grow(void)
{
    // Double the capacity
  capacity_ = (capacity_) ? capacity_ * 2 : 1;

  int *temp = new int[capacity_];

  for(unsigned int i = 0; i < size_; i++)
    temp[i] = array_[i];

  array_ = temp;
  ++allocs_;
}

array_ 是类 .h 文件中私有变量的一部分

private:
  int *array_;        // The dynamically allocated array
  unsigned size_;     // The number of elements in the array
  unsigned capacity_; // The allocated size of the array
  unsigned allocs_;   // Number of allocations (resizes)

根据 Valgrind,我遇到了一些内存泄漏问题: 大小为 4 的无效读取 地址 0x59ff044 是分配了大小为 4 的块后的 0 个字节

【问题讨论】:

  • capacity_ = (capacity_) ? capacity_ * 2 : 1 的意义何在?另外,使用std::vector 可能吗?它至少会修复您的实现中存在的内存泄漏(因为您永远不会删除旧数组)。
  • @sircodesalot 如果capacity_ 不为零,则将其加倍,否则将其设置为 1
  • 看起来赋值基本上是实现一个自己的向量,因此实现了一个动态数组(以及为什么这个类被称为Vector
  • 另外,你在哪里释放旧内存?
  • 我有另一个名为 clear 的函数,它在调用时清除分配的 array_,析构函数也释放 array_。 Aruisdante,你的假设是正确的,任务是用几个链表操作制作一个向量。这就是为什么不允许使用 std::vector 并且不允许使用 memcopy 或 realloc 的原因。

标签: c++ arrays memory-management memory-leaks allocation


【解决方案1】:

问题是你永远不会释放旧内存。

for(unsigned int i = 0; i < size_; i++)
   temp[i] = array_[i];

array_ = temp;

应该是:

for(unsigned int i = 0; i < size_; i++){
    temp[i] = array_[i];
}

delete[] array_;
array_ = temp;

您也可以使用 memcopy 代替 for 循环。

【讨论】:

  • 如果我被允许我会使用 memcopy 但我可以做这个特定功能的唯一方法是通过任何循环
  • 这解决了我的问题,谢谢!我发誓我试过 delete[] array_ 我想我忘了用 Valgrind 测试它。
  • 很高兴它成功了。如果它解决了您的问题,请接受答案(点击旁边的小复选框)
【解决方案2】:

如果你分配内存,你必须释放它,否则它会泄漏。

int *temp = new int[capacity_];

for(unsigned int i = 0; i < size_; i++)
    temp[i] = array_[i];

delete [] array_;  // this leaks if you don't free it.

array_ = temp;
++allocs_;

【讨论】:

    猜你喜欢
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多