-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!
您的'make_expression'返回'et',它是'Expression_Tree *'。 「Expression_Tree *」如何變成「Expression」?你有一個轉換構造函數?另外,如何實現'Expresion'的拷貝構造函數?它是複製構造函數,負責複製返回值,而不是賦值運算符。 – AnT
'operator ='返回值是一個巨大的錯誤 –
(如果有人想知道賦值運算符簽名後的'&')該特性是在C++ 11中添加的,有些人建議在賦值運算符上使用它。 [進一步閱讀](http://stackoverflow.com/questions/12306226/what-does-an-ampersand-after-this-assignment-operator-mean) –