【发布时间】:2018-03-02 05:04:42
【问题描述】:
我正在研究一个模板向量类,其中向量的大小没有预先定义。这是代码。
#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.
这里发生了什么?如果有人能澄清发生了什么,我将不胜感激。
【问题讨论】:
-
arr被初始化为0或NULL指针。你期待什么? -
更进一步,@AustinBrunkhorst 指出,
arr被初始化为0,并在void display()中被取消引用,但从未分配给。 (即没有new[]调用与析构函数中发生的delete[]调用相匹配。) -
是的,完全忘记了那部分。愚蠢的错误..
-
如前所述,
new[]缺失。最好保留另一个capacity,它可以跟踪向量可以包含多少。在insert_back中,它可以检查size是否超过capacity并分配更多并移动到a然后插入新值