2012-11-22 3 views
3

그래서 내가 아는 바로는 예비는 추상화를 초기화하지 않지만 단순히 추상화를 포함하기 위해 공간을 할당합니다. 그러나 v [0]은 항상 첫 번째 단위 화 된 메모리를 제공해서는 안되며 값을 할당하면 안됩니다.vector.reserve (2) 다음에 v [0] = 2가 잘못된 이유는 무엇입니까?

+0

['reserve()'] (http://en.cppreference.com/w/cpp/container/vector/reserve) 컨테이너 ['capacity']를 변경합니다 (http://en.cppreference.com/ w/cpp/container/vector/capacity)가 아니라 ['size'] (http://en.cppreference.com/w/cpp/container/vector/size)를 참조하십시오. 요소가 구성되지 않고 ['size()'] (http://en.cppreference.com/w/cpp/container/vector/size)는 0을보고합니다. – Blastfurnace

답변

9

reserve은 벡터 크기를 변경하지 않기 때문에. 필요한 경우 벡터의 크기를 늘릴 수있는 충분한 공간이있는 메모리의 위치로만 벡터를 이동시킵니다.

v[0]=2 또는 v[1]=0으로 전화 할 수 있으려면 이 아니라 resize(2)을 사용해야합니다.

1

정의되지 않은 동작을 호출하기 때문에. 라이브러리 작성자는 크기를 조정할 때까지 begin()의 주소를 nullptr로 합법적으로 남겨 둘 수 있습니다. 또는 0xBAADFOOD로 설정하십시오. 또는 HDD를 쓸 때 포맷하십시오.

이제는 초기화되지 않은 메모리가 발생합니다. 디버그에서 단언하는 것 말고는 벡터가 상태를 고칠 방법이 없다는 사실 외에는 무시 무시한 일이 발생하지 않습니다.

관련 문제