【问题标题】:Implementing a generic vector class in C++在 C++ 中实现一个泛型向量类
【发布时间】: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 被初始化为 0NULL 指针。你期待什么?
  • 更进一步,@AustinBrunkhorst 指出,arr 被初始化为 0,并在 void display() 中被取消引用,但从未分配给。 (即没有new[] 调用与析构函数中发生的delete[] 调用相匹配。)
  • 是的,完全忘记了那部分。愚蠢的错误..
  • 如前所述,new[] 缺失。最好保留另一个capacity,它可以跟踪向量可以包含多少。在insert_back中,它可以检查size是否超过capacity并分配更多并移动到a然后插入新值

标签: c++ templates vector


【解决方案1】:

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

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

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

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

【讨论】:

  • 明白。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多