2015-10-18 34 views
-2

我一直在遇到引起我瘋狂的分段錯誤的問題。基本上我有一個包含Expression_Tree的類表達式。我試圖設置我的變量current_expression等於來自中綴字符串的新表達式對象。複製賦值運算符中的分段錯誤

嘗試設置變量的表達式:

try{ 
    current_expression_ = make_expression(infix); //Segmentation fault here. 
}catch(Expression_Error ee){ 
    cerr << ee.what() << endl; 
} 

make_expression需要一個綴串,生成一個後綴,然後產生一個Expression_Tree,創建與表達式樹表達式對象,並返回它。

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 

好像樹試圖銷燬兩次,所以當析構函數被調用它的媒體鏈接deleated第二次並給出了一個分段錯誤。任何幫助指出問題或任何建議appriciated!

+2

您的'make_expression'返回'et',它是'Expression_Tree *'。 「Expression_Tree *」如何變成「Expression」?你有一個轉換構造函數?另外,如何實現'Expresion'的拷貝構造函數?它是複製構造函數,負責複製返回值,而不是賦值運算符。 – AnT

+2

'operator ='返回值是一個巨大的錯誤 –

+0

(如果有人想知道賦值運算符簽名後的'&')該特性是在C++ 11中添加的,有些人建議在賦值運算符上使用它。 [進一步閱讀](http://stackoverflow.com/questions/12306226/what-does-an-ampersand-after-this-assignment-operator-mean) –

回答

0

的問題是缺少拷貝構造函數所指出的螞蟻和PaulMcKenzie:

您添加什麼是轉換構造函數。拷貝構造函數應該有 有Expression :: Expression(const表達式&)簽名。你寫了一個拷貝構造函數嗎?如果沒有,那麼這是你的問題。在網上閱讀關於C++三規則的 。