C++ 拷贝分配算子中的分段错误

C++ 拷贝分配算子中的分段错误,c++,C++,我一直有一个分割错误的问题,这让我发疯。基本上我有一个包含表达式树的类表达式。我试图将变量current_expression设置为中缀字符串中的新表达式对象 尝试将变量设置为表达式: try{ current_expression_ = make_expression(infix); //Segmentation fault here. }catch(Expression_Error ee){ cerr << ee.what() << endl; }

我一直有一个分割错误的问题,这让我发疯。基本上我有一个包含表达式树的类表达式。我试图将变量current_expression设置为中缀字符串中的新表达式对象

尝试将变量设置为表达式:

try{
    current_expression_ = make_expression(infix); //Segmentation fault here.
}catch(Expression_Error ee){
    cerr << ee.what() << endl;
} 
运行程序时的输出:

>> 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

这棵树似乎要被破坏两次,所以当第二次调用析构函数时,它会被allready删除,并给出一个分段错误。任何指出问题的帮助或任何建议都是非常感谢的

正如AnT和PaulMcKenzie所指出的那样,问题在于缺少副本构造函数:

您添加的是一个转换构造函数。复制构造函数应该 具有Expression::Expression(const Expression&)签名。是吗 写一个复制构造函数?如果不是,那么这就是你的问题。阅读 关于C++中的三的规则。< /P>
您的
make_表达式
返回
et
,即
expression_树*
Expression\u Tree*
如何变成
Expression
?你有转换构造函数吗?另外,如何实现
Expresion
的复制构造函数?复制构造函数负责复制返回值,而不是赋值运算符。
运算符=
按值返回是一个巨大的错误(如果有人想知道赋值运算符签名后的
&
),该功能是在C++11中添加的,有些人建议在赋值运算符上使用它。抱歉,有些代码丢失了(现在是半夜,不是最佳焦点…)。我编辑了代码,所以它应该是正确的。另外:@Oskar:Please,pretty Please,使用RAII,不要像在
make\u expression\u tree中那样使用原始指针作为所有权
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