您好我正在为我的学习创建一个简单的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甚至更大。程序有时会崩溃,有时则不会。
我犯了错误吗?
答案 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
,数据存储在position
,position
增加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?