程序有时会崩溃,有时运行得很好。一个变量数组被声明,并且它的大小在程序中更改了2次。我正在使用visual studio。它在c++中。
这是c++中的代码:
int sz; //size of array
std::cin >> sz; //getting size
int* arr = new int[sz]; //declaring variable array.
for (int i = 0; i < sz; i++)
{
arr[i] = i; //assigning values to all members of array
std::cout << arr[i] << std::endl; //printing the array
}
std::cin >> sz; //size changes again
for (int i = 0; i < sz; i++)
{
arr[i] = i; //assigning new values
std::cout << arr[i] << std::endl; //printing the array
}
在这一行:
std::cin >> sz; //size changes again
这个评论并不完全正确。表示大小的变量已更改,但数组arr
未更改。因此,索引到任何大于或等于旧大小的位置都会调用未定义的行为。这意味着该程序有时可能有效,而其他程序则无效。
要调整arr
数组的大小,在上面的行之后,您需要执行以下操作:
delete [] arr;
arr = new int[sz];
如果你想调整arr的大小,你必须删除旧的并分配一个新的
delete[] arr;
arr = new int [sz];
如果你用new分配了一个向量,你应该在不再需要它之后删除它,并且不要随意重用它,这样你的代码会更好:
int sz; //size of array
{
std::cin >> sz; //getting size
int* arr = new int[sz]; //declaring variable array.
for (int i = 0; i < sz; i++)
{
arr[i] = i; //assigning values to all members of array
std::cout << arr[i] << std::endl; //printing the array
}
delete [] arr; // << Delete old one here, missing in original
}
{
std::cin >> sz; //size changes again
int* arr = new int[sz];
for (int i = 0; i < sz; i++)
{
arr[i] = i; //assigning new values
std::cout << arr[i] << std::endl; //printing the array
}
delete [] arr; // <<--- Here as well, missing in original - less important, but leads to memory leak.
}
或者只使用std::vector<int> arr(sz);
,您可以忽略删除。如果您绝对需要重复使用阵列,请使用arr.resize(sz);