【发布时间】:2016-01-17 03:55:06
【问题描述】:
我遇到了一个让我发疯的分段错误问题。基本上我有一个包含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(){
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
这棵树似乎试图被销毁两次,所以当第二次调用析构函数时,它已经被删除并给出了分段错误。任何指出问题的帮助或任何建议都将得到应用!
【问题讨论】:
-
您的
make_expression返回et,即Expression_Tree*。Expression_Tree*如何变成Expression?你有一个转换构造函数?另外,Expresion的复制构造函数是如何实现的?负责复制返回值的是复制构造函数,而不是赋值运算符。 -
operator=按值返回是一个巨大的错误 -
(如果有人在赋值运算符签名后想知道
&)该功能是在 C++11 中添加的,有些人建议在赋值运算符上使用它。 Further reading -
抱歉,丢失了一些代码(这里是半夜,不是最佳焦点..)。我编辑了代码,所以它应该是正确的。
-
还有:@Oskar:拜托,拜托,请使用 RAII,不要像
make_expression_tree那样使用原始指针作为所有权。
标签: c++