2011-02-09 3 views
2

에 할당되지 않은 경우이 같은 뭔가를 :행동은 []에는 매핑 된 값이 키

gcccpluplus.com에서 문서에서
#include <iostream> 
#include <map> 

int main() { 

    std::map<int, int*> mapaString; 
    int* teste = mapaString[0]; 
    std::cout << teste << std::endl; 
    if(!teste) 
     mapaString[0] = new int(0); 

    std::cout << mapaString[0] << std::endl; 
    std::cout << mapaString[1] << std::endl; 

    return 0; 
} 

그냥 요소의 기본 생성자를 호출 할 것이라고 말했다 것 포인터를 초기화하지 않고 선언하면 값은 정의되지 않습니다.

키에 할당 된 매핑 된 값이없고 반환 유형이 포인터 인 경우 하위 연산자 ([])를 호출 할 때 반환되는 값이 NULL 포인터가 될 수 있습니까?

+2

이 질문과 유사합니다 : http://stackoverflow.com/questions/936999/what-is-the-default-constructor-for-c-pointer – TheUndeadFish

+0

@ TheUndeadFish 네, 본질적으로 동일합니다. 고마워, 나는지도 컨테이너에 대해서만 조사했다. – coelhudo

답변

10

기본 유형 (포인터 포함)의 "기본 생성자"는 전역 변수와 마찬가지로 0으로 채워진 메모리를 생성합니다.

T 굳이 이렇게

가 아닌 POD 클래스 유형 :

하기 타입 T의 목적은 의미 기본값으로 초기화 : 여기

은 (dcl.init에서) 관련 표준 언어이다 ( 클래스) T의 기본 생성자가 호출됩니다 (T에 이 없으면 초기화가 잘못됨).

- T가 배열 유형 인 경우 각 요소가 기본값으로 초기화됩니다.

- 그렇지 않은 경우 개체의 저장소는 0으로 초기화됩니다.

...

7 그의 초기화 괄호 공집합 인 목적, 즉,()
기본적으로 초기화한다. lib.map.access에서도

:

23.3.1.2지도 요소 액세스 [lib.map.access]

참조 연산자 [] (CONST key_type & X);

반품 : (* ((make_pair (x, T()))).

-1

초기화되지 않은 변수와 마찬가지로 값이 제대로 초기화되지 않는다고 가정 할 수 없습니다. 내가 아마 이런 짓을 했을까 등의 빌드, 릴리스 또는 디버그, 컴파일러, 플랫폼에 따라 달라집니다 :

if(mapaString.find(key) == mapaString.end()) { mapaString[0] = 0; } 

그런 다음 당신은 키에 대한 포인터가 0/NULL로 초기화 확신 할 수 있습니다.

+0

실제로 기본 형식을 null/0으로 초기화하는 값으로 초기화됩니다.또한'find'와'[]'를 사용하면'map'을 두 번 검색 할 수 있습니다. 이는 피할 수 있습니다. –

+0

아. 나는 초기화되지 않은 버그에 너무 많은 시간을 물었을 뿐이라고 생각했다. – terloon