用C ++实现通用向量类

时间:2018-03-02 05:04:43

标签: c++ templates vector

我正在研究模板矢量类,其中矢量的大小未预先定义。这是代码。

#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.

这里发生了什么?如果有人能够澄清发生了什么,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

代码T* arr声明一个不指向任何内存地址的数组,即它的null。

当你调用insert_back()方法时,它会尝试在数组arr[size++] = value的末尾添加一个元素,这是无效的,因为你的数组没有内存地址来存储插入元素的值。

您的构造函数需要通过arr = new T[SIZE];语句为您尝试使用的数组动态分配内存。

最后,数组是固定大小的集合,无法自动调整大小,如果需要将元素添加到完全填满的数组,则需要为当前数组大小+ 1动态分配内存,并更改在复制了上一个数组中的所有内容后,指向新分配的内存的数组指针。