为什么这会让我违反访问权限? (C ++)

时间:2014-09-28 19:58:28

标签: c++ vector dynamic-memory-allocation

我正在为我的数据结构类构建一个vector类,我无法弄清楚为什么会抛出异常。这是完整的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;
}

1 个答案:

答案 0 :(得分:5)

我会按如下方式重写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