引发未经处理的异常:简单 C++ 程序中的读取访问冲突,动态增加数组长度以存储数字

Unhandled exception thrown: read access violation in simple c++ program that dynamically increase the array length to store numbers

本文关键字:增加数 增加 动态 数组 存储 访问冲突 数字 处理 异常 程序 C++      更新时间:2023-10-16

我正在做一个 c++ 作业,允许用户一个接一个地输入数字然后存储在数组中,并动态增加这个数组容量(乘以 2(。 基本上是使用一些基本代码模仿"向量"。

#include<iostream>
using namespace std;
struct myArray {
const size_t initial_size = 1;
const size_t growth_factor = 2;
size_t length = 0;
size_t capacity = initial_size;
int *v; // vector
};
int main() {
int x; 
myArray numbers;
while (true) {
cout << "Please input a numebr (program terminated once a -ve number is entered)" << endl;
cin >> x;
if (x < 0) 
break;
if (numbers.length == numbers.capacity) {
int *temp = new int[numbers.capacity *= numbers.growth_factor];
for (size_t i = 0; i < numbers.length; ++i)
temp[i] = numbers.v[i];
delete[] numbers.v;
numbers.v = temp;
}
numbers.v[numbers.length++] = x;
}
for (size_t i = 0; i < numbers.length; ++i) 
cout << numbers.v[i] << ",";
cout << endl;
return 0;
}

这是我得到的错误,我的第 33 行代码旁边有小红叉: numbers.v[numbers.length++] = x; 当我将鼠标悬停在红十字上时,这是错误:错误消息的图片

Exception thrown: read access violation.
numbers.v was 0x111011101110111. occurred

通过查看我的代码行,我只是将 int 值"x"分配给数组"numbers.v"的第一个元素

我已经尝试寻找其他解决方案,但是我发现其他人的问题要先进得多,并且此读取访问违规错误似乎是由于不同情况下的不同原因造成的。

当你这样做时:

int *v;

您正在创建一个指向 int 的指针,但到目前为止,它仅指向不确定的内存。因此,尝试访问甚至v[0]也是未定义的行为,并且可能会引发读取访问冲突。initial_size不正确。v在一开始没有任何元素,因此v.length将在循环的第一次迭代时返回0,并且if语句的计算结果为 false。然后您将尝试访问

numbers.v[numbers.length++] = x;

这是未定义的行为。

您应该从一个元素开始v,以便v的起始大小是正确的:

int* v = new int[1];

另外不要忘记在最后释放内存以避免内存泄漏。