复制赋值运算符中的分段错误

时间:2015-10-18 21:45:05

标签: c++

我一直遇到一个让我疯狂的分段错误问题。基本上我有一个包含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

似乎树正在尝试被摧毁两次,所以当析构函数第二次被调用时,它已经全部被删除并给出了分段错误。任何帮助指出问题或任何建议是适当的!

1 个答案:

答案 0 :(得分:0)

AnT和PaulMcKenzie指出,问题是缺少复制构造函数:

  

您添加的是转换构造函数。复制构造函数应该   具有Expression :: Expression(const Expression&amp;)签名。你是否   写一个拷贝构造函数?如果没有,那么这就是你的问题。读   关于网络上的C ++三级规则。