我正在为我的数据结构类构建一个向量类,但我不知道为什么会引发异常。这是完整的Vector.h文件:

#include <iostream>

using namespace std;

template <class T>
class Vector {
private:

  // not yet implemented
  Vector(const Vector& v);
  Vector& operator=(const Vector& v);
  T * Tarray;
  int arraySize;
  int currentSize;

public:

Vector() {
    arraySize = 2;
    currentSize = 0;
    Tarray = new T[arraySize];
};
~Vector() {
    delete[] Tarray;
};

void push_back(const T &e) {
    ++currentSize;
    if (currentSize > arraySize) {
        arraySize *= 4;
        T * temp = new T[arraySize];

        for (int i = 0; i < currentSize; i++) {
            temp[i] = Tarray[i];
        }

        delete[] Tarray;
        Tarray = new T[arraySize];

        for (int j = 0; j < currentSize; j++) {
            Tarray[j] = temp[j];
        }

        delete[] temp;

        Tarray[currentSize - 1] = e;
    }

    else {
        Tarray[currentSize - 1] = e;
    }
};

void print() {
    for (int i = 0; i < currentSize; i++) {
        cout << Tarray[i] << "  ";
    }

};

int getCurrentSize() {
    return currentSize;
};

int getArraySize() {
    return arraySize;
};

// Not yet implemented
void pop_back();

int size() const;

T& operator[](int n);


};


这是我用来测试的完整main.cpp。

#include "Vector.h"
#include <iostream>
#include <string>

using namespace std;

int main() {
char c;

string * temp = new string[8];


Vector<string> newVector;

for (int i = 0; i < 8; i++) {
    newVector.push_back("Hello world");
    newVector.push_back("Hello world");
}

newVector.print();
cout << endl << "Current Size: " << newVector.getCurrentSize();
cout << endl << "Array Size: " << newVector.getArraySize();
cin >> c;
}

最佳答案

我将重写push_back如下:

void push_back(const T &e) {
    if (currentSize+1 > arraySize) {
        arraySize *= 4;
        T * temp = new T[arraySize];

        for (int i = 0; i < currentSize; i++) {
            temp[i] = Tarray[i];
        }

        delete[] Tarray;
        Tarray = temp;
    }
    Tarray[currentSize] = e;
    ++currentSize;
};


更改为:


在复制内容之前,不要更新currentSize(这样就不会超出Tarray的范围)。
不要分配和复制两次。删除后,只需将Tarray分配给temp即可。
只能将元素粘贴到Tarray的一个位置。
之后,请更新currentSize,以避免必须执行-1(它确实需要在第一个+1中使用单个if

关于c++ - 为什么这会给我造成访问冲突? (C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26089049/

10-12 01:27