分割错误是由于构造函数
Segmentation fault is coming due to constructor
我写了一个c++代码来构建二叉搜索树。代码编译正确,但当我试图运行可执行文件,其给出分段错误。下面是我的代码:
#include <iostream>
using namespace std;
struct Node{
Node *parent, *right, *left;
int data;
};
class bst{
private:
Node* root;
public:
bst (int data);
void insert (Node * node, int data);
void insert (int data);
Node * search (int data);
Node * search (Node * node, int data);
// remove (Node * node, int data);
};
bst::bst (int data){
root -> data = data;
}
void bst::insert (Node * node, int data){
if (node == NULL){
node -> data = data;
}
else if (data < node -> data){
insert (node -> left, data);
}
else if (data > node -> data){
insert (node -> right, data);
}
}
void bst::insert (int data){
insert (root, data);
}
Node * bst::search (Node * node, int data){
if (node == NULL || node -> data == data)
return node;
else if (data < node -> data)
return search (node -> left, data);
else if (data > node -> data)
return search (node -> right, data);
}
Node * bst::search (int data){
search (root, data);
}
int main(){
cout << "main entryn";
bst __bst (10);
cout << "new causing problemn";
bst bst2(1);
// bst *my_bst = new bst(10);
cout << "tree createdn";
/* my_bst -> insert(32);
my_bst -> insert(3);
my_bst -> insert(36);
my_bst -> insert(93);
my_bst -> insert(23);
cout << "insertion completedn";
if (my_bst -> search(4) == NULL )
cout << "4 does not existn";
if (my_bst -> search(36) != NULL)
cout << "36 exists in treen";
*/ return 0;
}
在调试这个问题时,我发现了一个有趣的现象。当main函数只包含bst __bst (10);对象定义和"new cause problemn"注释时,它不打印任何东西。所以我假设第一个对象定义引起了问题。但是当我将bst bst2(1);或bst *my_bst = new bst(10);放在main中时,分割错误再次发生,但不是在"新导致问题n"打印之前。所以执行确实到了那个点。因此,在这种情况下,第一个对象定义没有引起任何问题。
谁能告诉我是什么原因导致了分割错误,为什么会发生这种奇怪的事情?
编辑:正如你们所有人指出的那样,我试图在构造函数代码期间解引用NULL指针,我做了建议的更改,代码工作得很好。但我有一个类似的程序,即使没有这些改变也能工作。下面是它的代码:
#include <iostream>
using namespace std;
struct Name{
string first_name;
string last_name;
};
class Person{
public:
Person (string first_name, string last_name){
name -> first_name = first_name;
name -> last_name = last_name;
}
int get_age(){
return age;
}
void set_age (int new_age){
age = new_age;
}
string get_first_name(){
return name -> first_name;
}
string get_last_name(){
return name -> last_name;
}
private:
Name * name;
int age;
};
int main (){
Person prince ("Prince", "Kumar");
cout << prince.get_first_name() << endl;
cout << prince.get_age() << endl;
return 0;
}
在这种情况下,程序运行得非常好。Name
的默认构造函数是否为name
指针分配了一些空间?我知道它分配0值给数值类型和NULL指针,对象和字符串。我说的对吗?
private:
Node* root;
根没有在构造函数
中初始化bst::bst (int data){
root -> data = data;
}
您在insert()
中解引用空指针,当树为空时
在你的构造函数中,你正在解引用根,这是一个指针,没有分配任何内存给它,这是未定义的行为:
bst::bst (int data){
root -> data = data;
}
这样就足够了:对于这个问题
bst::bst (int data) : root( new Node )
^^^^^^^^^^^^^^^^
{
root -> data = data;
}
只使用初始化列表来分配内存。你的insert
方法也有同样的问题:
if (node == NULL){
node -> data = data;
}
解决方法类似:
node = new Node ;
node->data = data ;
要使其工作,尽管您需要正确初始化right
, left
和parent
,我建议在Node
中使用构造函数:
Node() : parent(NULL), right(NULL), left(NULL) {}
相关文章:
- "error: no matching function for call to"构造函数错误
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- C++ OpenCV 卡尔曼滤波器构造函数错误
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- C++ 中常量属性的初始化构造函数错误
- STL向量上出现奇怪的复制构造函数错误
- C++ 乘法定义的构造函数错误消息似乎错误
- 通过构造函数错误地播种梅森扭曲
- C++ 多态构造函数错误;标识符未定义
- 类组合中的构造函数错误
- C++中的构造函数错误
- 构造函数错误:错误:数字常量之前的预期“”,“”或“..”
- 这个奇怪的复制构造函数错误抱怨的是什么
- Singleton子类构造函数错误
- 默认构造函数错误 (C++)
- 基类构造函数错误
- 初始化列表构造函数错误带有CRTP
- C++可能存在写入位置的构造函数错误冲突
- 构造函数错误:需要标识符
- 复制构造函数错误:对象的类型限定符与成员函数不兼容