2017-09-19 14 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(); 

프로그램이 작동합니다. 나는 주에 1 * 1를 전달하면

, 충돌이 발생 (SegmentationFault) :

내 문제를 반복 할 것이다
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; 
} 

가 :

전체 main 기능

이있다.
코드를 편집하고 1 x 1을 전달하면 올바르게 작동합니다.

내가 누락 된 것이 있습니까? std::map? 어쩌면 와일드 카드 같은 것으로 사용되는 *과 관련된 것이 있습니까?

+0

용어 "메모리 누수"를보고 다시'new' 사용하지 않습니다. – nwp

+6

'*'는 여러 쉘의 특수 문자로, 기본적으로 현재 디렉토리의 모든 파일로 확장됩니다.'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 

나는 백 슬래시 버전을 사용하는 것이 좋습니다. 프로그램이 main을 호출하는 경우 귀하의 경우에는

은, 당신은 할 것 :

$ ./main 1 \* 1 ex 
+0

내 초점이 지금지도에 있었고, 나는 확실히'unique_ptr'을 들여다 볼 것입니다! 고맙습니다! – magicleon