最后的控制台崩溃(循环)不是超出界限的错误

时间:2017-10-25 19:14:00

标签: c++ data-structures

您好我正在为我的学习创建一个简单的Vector Class。 只是存储变量 LONG 我保持一切简单。当我构建什么都没有返回错误/警告。 然后在运行程序后,它可以工作,但程序崩溃了。

Code Vector.h

Xrm.Page.ui.formSelector;

};

Vector.cpp

class Vector{
public:
    Vector();
    void add(long i);
    void getData();
private:
    long *anArray;
    long maxSize;
    long position;
    void reSize(int i);

主要

    Vector::Vector(){
    maxSize = 2;
    anArray = new long[maxSize];
    position = 0;
}

void Vector::add(long i){
    if(position==maxSize-1)
        reSize(maxSize * 2);

    anArray[position] = i;
    position++;
}

void Vector::reSize(int i){
    long *temp = new long[maxSize];
    for(int i =0; i<maxSize; i++)
    {
        temp[i] = anArray[i];
    }
    delete[] anArray;
    anArray = temp;
}

void Vector::getData(){

    for(int i = 0; i<position; i++)
    {
        cout << "Element" << i+1 << " : " << anArray[i] << endl;
    }
}

如果输入数据很小(例如10-20),程序就不会崩溃 但当我把它改为100甚至更大。程序有时会崩溃,有时则不会。

我犯了错误吗?

1 个答案:

答案 0 :(得分:1)

void Vector::add(long i){
    if(position==maxSize-1)
        reSize(maxSize * 2);

    anArray[position] = i;
    position++;
}

position==maxSize-1时,调用reSize使数组的大小加倍。不幸的是,reSize已被破坏。

void Vector::reSize(int i){
    long *temp = new long[maxSize];
    for(int i =0; i<maxSize; i++)
    {
        temp[i] = anArray[i];
    }
    delete[] anArray;
    anArray = temp;
}

从不使用参数i。这应该是Vector的新大小,而是使用与前一个数组相同的maxSize分配新数组。 maxSize保持不变。

返回add,数据存储在positionposition增加1。这意味着下一个add position等于maxSize,因此请检查以防止超出数组,

if(position==maxSize-1)

将不会执行您想要的操作,并且程序会在数组的边界外写入。从那里开始,position不断变大,永远不会等于maxSize减去一个,并且写得越远越界,而不是那时重要。 Undefined Behaviour has already been invoked,Crom只会知道会发生什么。也许程序崩溃,也许程序崩溃了,也许它做了一些奇怪的事情,也许甚至看起来像一切都工作得很好。

你想要的更多内容

void Vector::reSize(int newSize){ // note more descriptive name
    long *temp = new long[newSize]; // using new size, not old size
    for(int i =0; i<maxSize; i++)
    {
        temp[i] = anArray[i];
    }
    delete[] anArray;
    anArray = temp;
    maxSize = newSize; // store new size.
}

Vector还需要一个析构函数来清理anArray,但为了正确修复此错误,这里有一些建议阅读:What is The Rule of Three?