C++ 程序有时崩溃,有时工作得非常好。声明了一个变量数组,其大小在程序中更改了2次

C++ 程序有时崩溃,有时工作得非常好。声明了一个变量数组,其大小在程序中更改了2次,c++,arrays,C++,Arrays,程序有时崩溃,有时工作得非常好。在程序中声明变量数组,其大小更改2次。我正在使用VisualStudio。它是在C++中。 这是c++中的代码: int sz; //size of array std::cin >> sz; //getting size int* arr = new int[sz]; //declaring variable array. for (

程序有时崩溃,有时工作得非常好。在程序中声明变量数组,其大小更改2次。我正在使用VisualStudio。它是在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
}
intsz//数组大小
标准:cin>>sz//变大
int*arr=新的int[sz]//声明变量数组。
对于(int i=0;i
std::cin >> sz;                        //size changes again
注释并不正确。表示大小的变量已更改,但数组
arr
未更改。因此,索引到大于或等于旧大小的任何位置都将调用未定义的行为。这意味着程序有时可以工作,而其他程序则无法工作

要调整
arr
数组的大小,在上述行之后,需要执行以下操作:

delete [] arr;
arr = new int[sz];
在这一行:

std::cin >> sz;                        //size changes again
注释并不正确。表示大小的变量已更改,但数组
arr
未更改。因此,索引到大于或等于旧大小的任何位置都将调用未定义的行为。这意味着程序有时可以工作,而其他程序则无法工作

要调整
arr
数组的大小,在上述行之后,需要执行以下操作:

delete [] arr;
arr = new int[sz];

如果要调整arr的大小,必须删除旧的arr并分配新的arr

delete[] arr;
arr = new int [sz];

如果要调整arr的大小,必须删除旧的arr并分配新的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.
}
int sz;//数组大小
{
std::cin>>sz;//获取大小
int*arr=newint[sz];//声明变量数组。
对于(int i=0;istd::cout如果您使用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.
}
int sz;//数组大小
{
std::cin>>sz;//获取大小
int*arr=newint[sz];//声明变量数组。
对于(int i=0;istd::cout
//大小再次更改
不,不会更改。您只是在为
sz
读取一个新值,这不会调整
arr
^如果您输入的第二个数字大于第一个,则会出现未定义的行为(UB“有时崩溃,有时工作正常”是完全正确的)也可以使用一个变量数组——一个现代的C++程序不应该这样做:<代码> int *ARR= new int [sZ];< /C> >,而应该使用<代码> STD::vector ARR(SZ);
//大小再次更改
不,不会更改。您只是在为
sz
读取一个新值,这不会调整
arr
^如果您输入的第二个数字大于第一个,则会出现未定义的行为(对于UB来说,“有时崩溃,有时工作正常”是完全正确的)也可以使用一个变量数组——一个现代的C++程序不应该这样做:<代码> int *ARR= new int [sZ];< /C> >,而应该使用<代码> STD::vector ARR(SZ);
。您显示了一个正确的解决方案,但您没有解释原始代码中的错误。我在上面标记了两个缺失的delete以使其更清楚。请记住,原始代码中缺失的是两个delete,而不是一个。在原始代码中,只有一个
delete[]
缺失,因为只有一个
new int[sz]
。答案仍然没有解释原始代码中的问题是什么。原始代码中缺少一个新的和两个删除,而原始代码的问题是数组被不必要地重复使用。对于数组的每次单独使用,始终使用new和delete是避免这种情况的最佳方法,并且使用smaller scope有助于实现这一点。您展示了一个正确的解决方案,但没有解释原始代码中的错误。我在上面标记了两个缺失的delete以使其更清楚。请记住,原始代码中缺失的是两个delete,而不是一个。在原始代码中只有一个
delete[]
缺少,因为只有一个
新int[sz]
。答案仍然没有解释原始代码中的问题是什么。原始代码中缺少一个新的和两个删除,而原始代码的问题是数组被不必要地重复使用。对于数组的每次单独使用,始终使用new和delete是避免这种情况的最佳方法,并且使用smaller范围有助于实现这一点。