【问题标题】:Segmentation fault in copy assignment operator复制赋值运算符中的分段错误
【发布时间】: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= 按值返回是一个巨大的错误
  • (如果有人在赋值运算符签名后想知道&amp;)该功能是在 C++11 中添加的,有些人建议在赋值运算符上使用它。 Further reading
  • 抱歉,丢失了一些代码(这里是半夜,不是最佳焦点..)。我编辑了代码,所以它应该是正确的。
  • 还有:@Oskar:拜托,拜托,请使用 RAII,不要像 make_expression_tree 那样使用原始指针作为所有权。

标签: c++


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 2017-11-21
    • 2017-04-19
    • 2012-03-01
    • 1970-01-01
    • 2016-07-13
    • 2011-11-16
    • 2020-02-28
    • 2020-04-09
    相关资源
    最近更新 更多