这个程序有时会崩溃,有时运行得很好.一个变量数组被声明,并且它的大小在程序中更改了2次



程序有时会崩溃,有时运行得很好。一个变量数组被声明,并且它的大小在程序中更改了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);

相关内容

  • 没有找到相关文章

最新更新