【问题标题】:Destructor causes Segmentation Fault析构函数导致分段错误
【发布时间】:2013-04-30 21:20:41
【问题描述】:

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

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

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

【问题讨论】:

  • 您不应该循环到大小而不是顶部元素吗?堆栈通常有可索引的元素吗?
  • 并且top 永远不会在复制构造函数中为新对象设置。
  • 等等,为什么top 不是一个函数(如果没有函数,我也认为size 也是如此)?
  • 对不起,我应该指定的。我正在从数组中构建一个堆栈。所以当你看到 stack 这个词时,它就是类“stack”,它包含一个动态分配的数组。
  • 在调用push()之前尝试初始化size成员

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


【解决方案1】:

行:

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

应该是:

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

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

【讨论】:

  • 如果就这么简单,我可能会发现:P 名称有点不准确(对此无能为力,我的老师选择了它们)。 “Top”是堆栈顶部元素上方的索引,或者换句话说,大小,“size”是容量(想想“maxSize”)。因此,top 已经迭代了所有已分配的元素。感谢您的反馈:D
  • 物品是什么类型?它被声明为 int* 吗?
  • 代码大部分时间都能正常工作,只是在特殊情况下会失败,即使用复制构造函数的情况。
【解决方案2】:

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

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

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

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

【讨论】:

  • 无法确定,因为我没有完整的代码,但这听起来不像是正确的解决方案...NULL 是一个有效定义为0 的宏。所以这一行所做的只是将items 数组中的一个整数设置为0。它不应该对析构函数中的delete 产生任何影响。你有没有打电话给delete items[size - 1] 以及pop
  • 分配本身不是原因 - 分配 NULL 不会导致任何内容被删除。特别是,将NULL 分配给int 只会将其设置为零,并且一个充满零的数组无论如何都不是“空的”。 size-1 更有可能是数组外部的索引 - 这样做时请确保 size 大于零。
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 2014-02-17
  • 2017-02-28
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
相关资源
最近更新 更多