2014-02-21 4 views
4

나는이 코드 조각이 :C++ 벡터

#include<iostream> 
#include<vector> 

class A 
{ 
    private: 
     static int x; 

    public: 
     A(){} 
     ~A() 
     { 
      ++x; 
      std::cout << "destroying A " << x << std::endl; 
     } 

}; 

int A::x(0); 

int main (int args, char** argv) 
{ 
    std::vector<A> vectA(5); 
} 

을 내가 그것을 실행할 때 나는 5 선을 인쇄하는 기대 (소멸자가의 5 개 각 요소에 대해 호출됩니다 즉, 벡터)하지만 실제로 출력은 다음과 같습니다

destroying A 1 
destroying A 2 
destroying A 3 
destroying A 4 
destroying A 5 
destroying A 6 

이상한 음 ...

그래서 난에 주요 기능을 변경 :

및 현재의 출력은 :

destroying A 1 
5 
destroying A 2 
destroying A 3 
destroying A 4 
destroying A 5 
destroying A 6 

확인 I 추측 그래서 제가 벡터로서 (타입 A의 목적 단지 크기, 이는 동적으로 크기가 조정 된 할당 된 메모리를 얻을 vectA을 만들 때) 5 요소를 포함하는 것입니다 (그리고이 과정에서 이전에 할당 된 메모리를 해제하고 소멸자가 호출되면). 그럼 내 질문은 : vectA 처음부터 올바른 금액의 메모리를 얻지 못하는 이유는 무엇입니까? 결국 (5) 값은 컴파일 타임에 이미 알려져 있습니다. 이 최적화를 수행하지 않는 컴파일러에 대한 특별한 이유가 있습니까?

explicit vector(size_type count, const T& value = T(), const Allocator& alloc = Allocator()); 

일단 C++ (11)는 주위 온을,이 생성자는 단지 크기를 복용하고 변경되었다 :

+0

나중에 코드를 강조하기 위해 따옴표를 사용하지 마십시오. – Brandon

+0

확인. 호기심에서 벗어나, 그들에게 무슨 문제가 있습니까? – UndefinedBehavior

+0

코드는 일반 텍스트이며 강조 표시가없고 형식이 손실되기 때문에 따옴표로 묶은 코드를 읽을 수 없습니다. 나는 그것을 이미 고쳤지만 나중에 참조하기 위해 수정했다. – Brandon

답변

8

전에 C++ 11에, 그 코드는 valuecount 복사본을 만들어이 생성자를 사용합니다 count 값 초기화 요소 만들기 :

따라서
explicit vector(size_type count); 

, 11 C++ 이전을, 당신은 다섯 개 가지 요소와 결합 될 때, 총 6을 만들고, 생성 된 value 매개 변수를 얻을. C++ 11 이후에는 5 가지 요소 만 있습니다.