程序中的堆栈溢出问题

时间:2010-04-03 06:22:29

标签: c++ stack-overflow

因此,当我尝试运行此程序时,我正在获得一个奇怪的堆栈溢出异常,该程序从数据/文本文件中的列表中读取数字并将其插入到二叉搜索树中。奇怪的是,当程序工作时,我有一个随机顺序的4095个数字列表。但是,当我有一个按递增顺序排列的4095个数字时(因此它生成一个线性搜索树),它会抛出一个堆栈溢出消息。问题不是静态计数变量,因为即使我删除了它,并且把t = new BinaryNode(x,1)它仍然给出了堆栈溢出异常。我试过调试它,它在if (t == NULL){ t = new BinaryNode(x,count);处破坏了这是插入函数。

BinaryNode *BinarySearchTree::insert(int x, BinaryNode *t) {
 static long count=0;
 count++;

 if (t == NULL){ 
  t = new BinaryNode(x,count);
  count=0;
 }
 else if (x < t->key){
  t->left = insert(x, t->left);
 }
 else if (x > t->key){
  t->right = insert(x, t->right);
 }
 else
  throw DuplicateItem();
 return t;
}

2 个答案:

答案 0 :(得分:1)

在像C ++这样的语言中,你不能在高大的树上使用递归算法,因为每个函数调用都在有限的堆栈上使用额外的空间。您必须更改算法(使用迭代而不是递归)或使用平衡的二叉树结构。

如果你有一个有界输入(就像你在这种情况下所做的那样),你可以通过使堆栈更大(如Andreas建议的那样)或者在堆栈上放置更少的数据来减轻堆栈压力。似乎insertBinarySearchTree类的成员函数,即使它没有引用该类的任何其他成员。如果你使insert成为静态方法(或不在类中的常规函数​​),则不必为每个函数调用在堆栈上推送this指针,并且你将能够在溢出之前获得更多迭代。

答案 1 :(得分:0)

您可以增加堆栈的大小。根据您使用的编译器,这是以不同的方式完成的。例如,在Visual Studio中,可以使用命令行选项设置堆栈大小:

/F stacksize