我的c++程序在这个函数上崩溃了
My C++ program crashes on this function?
我是一个初级程序员(刚刚开始),我正在为二叉搜索树编写一些代码。由于某种原因,每当我调用这个追加函数时,我的程序就会崩溃。它与两个函数本身之一有关,而不是头文件或包含main()的源文件中的任何其他内容。顺便说一下,Leaf只是一个具有int值的结构体,以及两个名为left和right的Leaf指针。
这个程序崩溃,没有输出错误。
Leaf* BinarySearchTree::GetLeaf(int x,Leaf*a)
{
int key = a->value;
cout <<key<<"n";
if(x > key)
{
if(a->right == NULL)
{
Leaf* newleaf = new Leaf();
newleaf->value = x;
a->right = newleaf;
return newleaf;
}
else if (a->right != NULL)
{
return a->right;
}
}
else if(x< key)
{
if(a->left == NULL)
{
Leaf* newleaf = new Leaf();
newleaf->value = x;
a->left = newleaf;
return newleaf;
}
else if (a->left != NULL)
{
return a->left;
}
}
else if(x == key)
{
//tbc
}
}
void BinarySearchTree::Append(int x)
{
if(root != NULL)
{
Leaf* current = root;
while(current->value != x)
{
current = BinarySearchTree::GetLeaf(x,current);
cout<<"value: "<<
current->value;
}
}
else
{
cout <<" No ROOT!";return;
}
}
如果你想看我的主(源)文件,请到这里(因为我不想淹没这篇文章)http://pastebin.com/vrh7KkMm
如果您想查看头文件的其余部分,即这两个函数所在的位置,http://pastebin.com/ZGWewPdV
在BinarySearchTree构造器中,您开始访问根,而没有首先为其分配内存。这可能是你的崩溃。尝试添加
root = new Leaf()
在构造函数开头。
编辑-更多信息:
c++不会自动为成员变量设置值,通常需要手工初始化。(c++11允许你在声明中这样做)。这意味着任何未设置值的变量都将具有垃圾值。如果你使用这个垃圾值作为指针,你很可能会崩溃。
在您的例子中,最初的问题之一是LinkedList类在开始引用它之前没有在构造函数中初始化它的根成员变量。
BinarySearchTree也有同样的问题。
学习使用调试器是学习编程时你能做的最好的事情之一。它允许您逐行执行代码,并查看每个变量的值。这让我很容易看到事情没有按照你的计划进行。使用哪个调试器取决于您的平台。如果用x == key
调用GetLeaf()
,则该函数既不返回nullptr
,也不返回有效指针。这是一个潜在的崩溃源。在任何情况下,你都需要返回一些合理的东西。
更新:不要忘记在构造函数中正确初始化Leaf结构(所有三个成员)。
UPDATE2:还要正确初始化您的根。我将用nullptr初始化它,并更改append函数,使其创建第一个leave(如果root==nullptr)
- 内联映射初始化的动态atexit析构函数崩溃
- C++设置器函数崩溃
- 在C++中删除指针数组时析构函数崩溃
- 使用向量的函数崩溃,调试器说访问冲突读取位置
- 分配内存并在回调时调用C++的 Rust 函数崩溃
- MEX文件实现特征库伪内函数崩溃
- C :复制构造函数崩溃
- 创建'new'实例可以解决析构函数崩溃问题?
- wglCreateContextAttribsARB函数崩溃
- OpenCV 均值函数崩溃,掩码从 OpenCV 阈值函数创建
- 使用Armadillo类型的lambda函数崩溃的未知原因
- 空析构函数崩溃程序:C++
- avformat_open_input函数崩溃
- boost::任何析构函数崩溃
- VS CTP 14的std::线程析构函数崩溃
- 使用std::enable_shared_from_this时,析构函数崩溃
- C++继承虚拟函数崩溃
- 分配空终止符时Windows剪贴板函数崩溃
- 从函数崩溃返回,仅在代码中的某个点之后
- 模板函数崩溃