析构函数导致分段错误

时间:2013-05-07 02:24:39

标签: c++ segmentation-fault destructor copy-constructor dynamic-allocation

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

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

我觉得我正在复制构造函数错误,但我无法弄清楚它是什么。

2 个答案:

答案 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;不处理空数组(我猜是有道理的。删除命令期望一个数组比我最终的数组要长得多)。