2013-07-17 1 views
-5

다음과 같이 확인합니까?C++ 클래스에 대한 포인터로 malloc 및 sizeof 사용

int n=5; 
map<string,int> * maps = (map<string,int> *)malloc(n*sizeof(map<string,int>)); 
for (int i=0; i<n; i++) { 
    maps[i] = map<string,int>(); 
    char * i_str = (char *)malloc(10); 
    sprintf(i_str,"%d",i); 
    char * key = (char *)malloc(100); 
    strcpy(key,"key"); 
    strcat(key,i_str); 
    (maps[i])[string(key)] = i*i; 
} 

저는 사람들이 C++에서 malloc 대신 새로운 것을 사용한다고 말합니다. 그러나 내가 이렇게하면, 어떤 문제가 발생할 수 있다면 어떨까요?

편집 : 코드가 정상적으로 컴파일되고 정상적으로 실행됩니다 (g ++ 4.6.3). 질문이 보류되어있는 이유를 모르지만 기술적으로 올바른지 알고 싶습니다 (스타일에 신경 쓰지 않습니다). 잘 모르겠어요 한 가지 라인

maps[i] = map<string,int>(); 

구문이 올바른지, 그리고 한 사람이 제안 정말 예상치 못한 동작이 발생할 않습니다 여부입니다.

누군가는 아직 내가하고있는 일이 정의되지 않았 음을 보여주는 C++ 사양에 대한 참조를 제공하지 않았습니다. 그래서이 질문은 아직 답을 얻지 못했습니다.

+0

이렇게하면 안됩니다. – chris

+14

아니, 전혀 괜찮지 않아. –

+0

Y U DO DIS ????? –

답변

3

주요 문제는지도 생성자가 실행되지 않는다는 것입니다.

생성자가 없으면 맵의 상태가 잘못되어 제대로 작동하지 않습니다.

새로 배치를 사용하여 생성자를 수동으로 호출 할 수 있습니다.

편집 : 그것이 복사 할 수 있습니다 전에지도가 유효한 상태에 있어야하기 때문에

그러나 maps[i] = map<string,int>();

는,이 작동하지 않습니다 그냥 당신이지도가 유효 만들려고 할 것을 깨달았다 (아직 구성되지 않았기 때문에 현재 유효하지 않습니다.)

또한 프로그램에 많은 메모리 누수가 있습니다. smart pointers (작동하려면 스마트 포인터로 new을 사용해야 함) 또는 free을 할당해야합니다.

+0

메모리 누수에 대해 언급하면 ​​+1을 다시 돌려 드리겠습니다. –

+0

예. 메모리 누수에 대해 알고 있습니다. 나는 그냥 무료로 사용하거나 삭제할 수 있지만, 그 점은 문제가 아닙니다. – onelineproof

+0

@onelineproof 나중에 참조 할 수 있도록 C++에는 생성 할 필요가없는 클래스에 대해 POD라는 카테고리가 있습니다. [std :: is_pod] (http://en.cppreference.com/w/cpp/types/is_pod)를 사용하여 컴파일 타임에 클래스가 POD인지 여부를 쿼리 할 수 ​​있습니다. 다음은 예제입니다 : http://ideone.com/gZ0sqH (std :: is_pod는 이전 컴파일러에서 구현되지 않을 수도 있습니다). – Lalaland

2

명령 :지도를 저장하기위한

map<string,int> * maps = (map<string,int> *)malloc(n*sizeof(map<string,int>)); 

메모리를 예약하지만, 메모리를 초기화하지 않는 (생성자를 호출). 지도의 생성자는 여기에 추가 동적 할당이 필요할 가능성이 큽니다.

그런 다음

maps[i] = map<string,int>(); 

지도의 이전 내용을 취소하고 새로운 (빈) 내용으로 교체하기로지도의 사본을 할당 operator= 호출합니다. 그러나 이전지도가 유효한 상태가 아니기 때문에 여기에 문제가 발생할 가능성이 큽니다. 이 동작은 정의되지 않은 동작이며 아무 작업도 수행하지 않거나 임의로 충돌하거나 다른 임의의 작업을 수행 할 수 있습니다.

freemalloc 메모리가 없기 때문에 많은 메모리가 손실됩니다.

+0

@Mooing Duck : 편집 해 주셔서 감사합니다. – hivert

+0

예 :이 라인 (maps [i] = map ();)은 잘 모르겠습니다. 그러나 그것은 컴파일되고 정상적인 결과를주는 것으로 보인다. – onelineproof

+1

프로그램에 [정의되지 않은 동작]이 표시됩니다 (http://en.wikipedia.org/wiki/Undefined_behavior). "정상적인 결과를주는 것처럼 보입니다"는 정의되지 않은 동작의 가능한 표현입니다. –