我知道那里有很多类似的问题,但我还没有找到任何有用的东西。我已经在这几个小时了,这让我发疯了。当为复制构造函数创建的变量调用析构函数时,我会遇到分段错误。
//Copy Constructor
Stack::Stack(const Stack &aStack)
{
size = 0; //this is incremented as new items are pushed onto the stack.
cap= aStack.cap;
items = new int[aStack.cap]();
for (int i = 0; i < aStack.size; i++)
this->push(aStack.items[i]); //Adds an item if not full and increments size
// I have also tried: items[i] = aStack.items[i]
}
//Destructor
Stack::~Stack()
{
cap= 0;
size= 0;
delete [] items;
items = NULL;
}
我觉得我正在复制构造函数错误,但我无法弄清楚它是什么。
答案 0 :(得分:1)
该行:
for (int i = 0; i < aStack.top; i++)
应该是:
for (int i = 0; i < aStack.size; i++)
这是分段错误,因为您可能正在尝试访问超出范围的索引或类似的东西(未定义的行为区域)。
答案 1 :(得分:1)
好吧,我找到了。我会把它放在这里对任何人来说都像我一样愚蠢(缺乏基本的c ++知识)所以他们不会花费数小时寻找同样的事情。
我的问题是析构函数似乎是“有选择地”工作。它在一些测试中起作用,但在其他测试中失败了。经过几个小时的测试比较后,我终于找到了它。
通过测试pop函数完成失败的测试,一直持续到堆栈为空。
在我的析构函数中,有一条线说
delete [] items;
这本来没问题,除了我的pop函数有一行读items[size-1] = NULL;
所以在某种程度上,每次pop删除一个项目时,在调用析构函数之前它被删除/删除。由于我对c ++的基本知识,我不知道delete命令无法处理空数组。所以,我只是摆脱了提前删除项目的行(实质上,对于最终用户,由于封装,项目不再存在。顶级索引仍然会更改,因此无法再访问)
无论如何,最后一课:delete [] items
;不处理空数组(我猜是有道理的。删除命令期望一个数组比我最终的数组要长得多)。