我正在研究模板矢量类,其中矢量的大小未预先定义。这是代码。
#include <iostream>
using namespace std;
template <class T>
class genericVector {
private:
int size;
T* arr;
public:
genericVector(): size(0), arr(0) {}
~genericVector() {
delete[] arr;
}
void insert_back(const T& value) {
arr[size++] = value;
}
void display() {
for (int i = 0; i < size; i++)
cout << arr[i];
cout << "\n";
}
};
int main() {
genericVector<int> v1;
int input;
for (int i = 0; i < 5; i++) {
cin >> input;
v1.insert_back(input);
}
v1.display();
return 0;
}
在VisualStudio中运行时,程序会触发以下断点。
Exception thrown: write access violation.
this->arr was 0x1110112.
If there is a handler for this exception, the program may be safely continued.
这里发生了什么?如果有人能够澄清发生了什么,我将不胜感激。
答案 0 :(得分:1)
代码T* arr
声明一个不指向任何内存地址的数组,即它的null。
当你调用insert_back()
方法时,它会尝试在数组arr[size++] = value
的末尾添加一个元素,这是无效的,因为你的数组没有内存地址来存储插入元素的值。
您的构造函数需要通过arr = new T[SIZE];
语句为您尝试使用的数组动态分配内存。
最后,数组是固定大小的集合,无法自动调整大小,如果需要将元素添加到完全填满的数组,则需要为当前数组大小+ 1动态分配内存,并更改在复制了上一个数组中的所有内容后,指向新分配的内存的数组指针。