我一直遇到一个让我疯狂的分段错误问题。基本上我有一个包含Expression_Tree的类Expression。我正在尝试将变量current_expression设置为等于来自中缀字符串的新表达式对象。
尝试将变量设置为表达式:
try{
current_expression_ = make_expression(infix); //Segmentation fault here.
}catch(Expression_Error ee){
cerr << ee.what() << endl;
}
make_expression采用中缀字符串,生成后缀,然后生成Expression_Tree,使用表达式树创建一个Expression对象并将其返回。
Expression make_expression(const string& infix)
{
string postfix = make_postfix(infix);
cout << "Made postfix" << endl;
Expression_Tree* et= make_expression_tree(postfix);
cout << "Made Expression_Tree" << endl;
cout << "Returning Expression" << endl;
return Expression{et};
}
}
我的副本分配运算符和交换函数如下所示:
Expression Expression::operator=(const Expression& e) &{
cout << "In copy assign operator" << endl;
Expression{e}.swap(*this);
cout << "Swapped Expression and this" << endl;
return *this;
}
void Expression::swap(Expression& rhs){
cout << "In swap function" << endl;
std::swap(tree, rhs.tree);
}
我的Expression析构函数看起来像这样:
Expression::~Expression(){
cout << "In Expression destructor" << endl;
delete tree;
}
复制构造函数
Expression::Expression(Expression_Tree* input_tree)
:tree(input_tree){}
运行程序时的输出:
>> u
x=1+1
Made postfix
Made Expression_Tree
Returning Expression
In copy assign operator
In swap function
In Expression destructor
Swapped Expression and this
In Expression destructor
In Expression destructor
Segmentation fault
似乎树正在尝试被摧毁两次,所以当析构函数第二次被调用时,它已经全部被删除并给出了分段错误。任何帮助指出问题或任何建议是适当的!
答案 0 :(得分:0)
AnT和PaulMcKenzie指出,问题是缺少复制构造函数:
您添加的是转换构造函数。复制构造函数应该 具有Expression :: Expression(const Expression&amp;)签名。你是否 写一个拷贝构造函数?如果没有,那么这就是你的问题。读 关于网络上的C ++三级规则。