2

我知道那里有很多类似的问题,但我还没有找到任何有用的东西。我已经在这里待了几个小时了,这让我发疯了。当为复制构造函数创建的变量调用析构函数时,出现分段错误。

//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;
}

我觉得我做错了复制构造函数,但我不知道它是什么。

4

2 回答 2

1

嗯,我找到了。我会把它放在这里给像我一样愚蠢的人(缺乏基本的 c++ 知识),这样他们就不会花几个小时来寻找与我相同的东西。

我的问题是析构函数似乎“有选择地”工作。它在某些测试中有效,但在其他测试中失败。在比较了几个小时的测试后,我终于找到了。

失败的测试通过测试 pop 函数完成,一直持续到堆栈为空。在我的析构函数中,有一行说 delete [] items; This would have been fine 除非我的 pop 函数有一行这样读items[size-1] = NULL; 所以在某种程度上,每次 pop 删除一个项目时,它在调用析构函数之前被 NULLED/删除。由于我对 C++ 的基本了解,我不知道删除命令无法处理空数组。所以,我只是删除了提前删除该项目的行(本质上,对于最终用户,该项目由于封装而不再存在。顶部索引仍会更改,因此不再可访问)

无论如何,最后一课:delete [] items; 不处理空数组(我猜这是有道理的。删除命令期望的数组比我的最终数组长得多)。

于 2013-05-07T05:09:44.507 回答
1

该行:

for (int i = 0; i < aStack.top; i++)

应该:

for (int i = 0; i < aStack.size; i++)

这是段错误,因为您可能正在尝试访问超出范围的索引或类似的东西(未定义的行为领域)。

于 2013-05-07T02:44:21.607 回答