根据声明数组的方式,动态分配的数组的地址会破坏吗?

时间:2014-12-04 17:57:57

标签: c++ arrays dynamic

当数组声明为

时,以下代码似乎有效
int numbers[3]

但是当我尝试宣布它时

int* numbers = new int[3];

调整大小调整后的数组后,前两个数字似乎丢失了。 我无法弄清楚这两个声明之间有什么区别。任何澄清都会有所帮助。

int main() {
  int numbers_size = 0;
  int numbers_capacity = 3;
  //works when declared like this
  //does not work when declared like int* numbers = new int[3]
  int numbers[3];
  do {
    ...
    if(numbers_capacity == numbers_size)
      numbers_capacity = resize_array(numbers, numbers_size);
  }while(numbers[numbers_size - 1] != 0);
  return 0;
}

int resize_array(int* arr, int arr_size) {
  int* temp = new int[arr_size];
  for(int i = 0; i < arr_size; i++)
    temp[i] = arr[i];
  delete [] arr;
  arr = new int[4*arr_size];
  for(int i = 0; i < arr_size; i++) {
    arr[i] = temp[i];
  }
  delete [] temp;
  return 4*arr_size;
}

1 个答案:

答案 0 :(得分:1)

您正在更改arrresize_array的值以指向新的内存位置,但调用函数仍然具有旧的,现在悬空的内存位置。

将功能更改为:

int* resize_array(int* arr, int arr_size)
{
   int* temp = new int[arr_size];
   for(int i = 0; i < arr_size; i++)
      temp[i] = arr[i];

   delete [] arr; // This makes pointer in the calling function
                  // point to deleted memory.

   arr = new int[4*arr_size];
   for(int i = 0; i < arr_size; i++) {
      arr[i] = temp[i];
   }
   delete [] temp;

   // Return the newly allocated memory.
   return arr;
}

并使用它:

numbers_capacity = numbers_size*4; // This is bad. It assumes that
                                   // that you are increasing the size by 4 times.

numbers = resize_array(numbers, numbers_size);

您可以简单地使用std::vector<int>并避免一切头痛。