当数组声明为
时,以下代码似乎有效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;
}
答案 0 :(得分:1)
您正在更改arr
中resize_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>
并避免一切头痛。