2017-09-19 69 views
2

我正在編寫一個樣本C++程序來試驗多態性和地圖。 我有以下地圖:C++ std :: map在「*」上失敗?

map<char,Operation*> ops; 
ops['+'] = new Addition(); 
ops['-'] = new Subtraction(); 
ops['*'] = new Multiplication(); 
ops['/'] = new Division(); 

每個類從Operation繼承和不通過其名稱所建議的操作。

Everytrhing正常工作,但是當我訪問ops['*']程序崩潰。如果我使用一個不同的char,這樣說:

ops['x'] = new Multiplication(); 

程序工作。

整個main功能是這樣的:

int main(int argc, char** argv){ 
    int x = atoi(argv[1]); 
    char op = argv[2][0]; 
    int y = atoi(argv[3]); 
    map<char,Operation*> ops; 
    ops['+'] = new Addition(); 
    ops['-'] = new Subtraction(); 
    ops['*'] = new Multiplication(); 
    ops['/'] = new Division(); 
    cout<<ops[op]->op(x,y)<<endl; 
} 

我會重複我的問題:

如果我通過1 * 1到主,發生崩潰(SegmentationFault)。
如果我編輯代碼並通過1 x 1它工作正常。

有什麼我失蹤的std::map?也許有關*被用作通配符或什麼?

+0

查找術語「內存泄漏」,然後從不使用'new'一次。 – nwp

+6

'*'是大量shell中的特殊字符,基本上擴展爲當前目錄下的所有文件,嘗試通過'1 \ * 1'。 – Holt

+0

@nwp如果我應該清理它,這不是泄漏。在這裏,我不是因爲這是一個玩具程序而且一切都馬上消失! – magicleon

回答

3

的問題是不是你的C++代碼—即使它很酷利用unique_ptr,而不是原始指針—而是你的方法參數傳遞給你的程序,當你運行它來改善。

*字符在一個地段外殼的特殊含義,通常擴展到文件的當前目錄列表,如:

$ ls 
main.cpp main 
$ echo 1 * 1 
1 main.cpp main 1 

你需要或者用反斜槓轉義\或在調用程序時引號中傳遞:

$ echo 1 \* 1 
1 * 1 
$ echo 1 "*" 1 

我會建議使用反斜槓的版本,因爲一些shell可能甚至在標準的引號擴大*

在你的情況,如果你的程序被稱爲main,你會怎麼做:

$ ./main 1 \* 1 ex 
+0

我現在專注於地圖,我一定會考慮'unique_ptr'!謝謝! – magicleon