【问题标题】:Why is this function segfaulting?为什么这个函数会出现段错误?
【发布时间】:2011-05-18 14:13:43
【问题描述】:

函数是这样的:

Set::Set(Multinumber* tempArray[], int tempSize)
{
 numElements = tempSize;
 capacity = tempSize*2;
 setArray = new Multinumber*[capacity];
 for (int i=0; i<numElements; i++)
 {
  addElement(tempArray[i]);
 }
}

变量 setArray 在我的标头中声明为 Multinumber** 类型

每当我用这个调用它时,它都会出现段错误:

Multinumber* carr[2];
carr[0]=c4;
carr[1]=c5;
Set setb(carr,2);

c4 和 c5 已经被声明为指向正确类型对象的指针。

任何帮助将不胜感激。

编辑:下面的代码是 addElement 函数(为缩进道歉)

const Set Set::operator+(const Set& rhs) const
{
 Set result;
 int i=0, j=0;

 while ((i < numElements) && (j < rhs.numElements))
 {
  Multinumber* toadd=new Multinumber;
  toadd=*(setArray[i]) + *(rhs.setArray[j]);
  result.addElement(toadd);
  i++;
  j++;
 }

 while ((i < numElements))
 {
  result.addElement(setArray[i]);
  i++;
 } 


 while ((j < rhs.numElements))
 {
 result.addElement(rhs.setArray[j]);
 j++;
 }


 return result;
}

编辑: 根据许多 cout 语句,错误似乎在这个函数中:

 bool Set::isFull()
 {
  return (numElements == capacity);
 }

编辑:更改了数组索引,但仍然存在段错误

【问题讨论】:

  • 需要更多上下文。一个完整的、可编译的例子会很棒。
  • 您还没有提供 addElement 的代码。错误的可能位置还有默认构造函数、复制构造函数和 Set 类的析构函数,因此最好也发布该代码。

标签: c++ pointers segmentation-fault dynamic-memory-allocation


【解决方案1】:
carr[1]=c4;
carr[2]=c5;

不应该是这样的

carr[0]=c4;
carr[1]=c5;

?

忠告:如果您在调试器(例如 gdb)中加载它,它会识别出罪魁祸首,您会很快看到错误。

【讨论】:

  • 实际上,不幸的是仍然有段错误
  • @Ross 你能在 gdb 或其他调试器中启动代码,看看它告诉你什么吗?此外, addElement() 的代码可能会有所帮助 - 我看不出还有什么错误。
  • 添加了addelement功能。不幸的是,我现在没有调试器,也无权在这台计算机上安装调试器。我很确定 addelement 确实有效,因为我在程序的另一个地方使用过它并且它没有段错误。
  • 实际上,添加 cout 语句似乎表明它在 addElement(params) 处 确实 segfault
  • 添加了另一个代码示例。 couts 说段错误不可能出现在其他任何地方。
【解决方案2】:

数组使用从零开始的索引,因此将carr[2] 设置为双长度数组中的任何内容都是未定义的行为。你应该感激这是一个段错误。 :-)

试试:

Multinumber* carr[2];
carr[0]=c4;
carr[1]=c5;
Set setb(carr,2);

这应该处理段错误。

【讨论】:

  • 那么需要更多上下文。请提供相关类的定义...
猜你喜欢
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
相关资源
最近更新 更多