나는이 코드 조각이 :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)는 주위 온을,이 생성자는 단지 크기를 복용하고 변경되었다 :
나중에 코드를 강조하기 위해 따옴표를 사용하지 마십시오. – Brandon
확인. 호기심에서 벗어나, 그들에게 무슨 문제가 있습니까? – UndefinedBehavior
코드는 일반 텍스트이며 강조 표시가없고 형식이 손실되기 때문에 따옴표로 묶은 코드를 읽을 수 없습니다. 나는 그것을 이미 고쳤지만 나중에 참조하기 위해 수정했다. – Brandon