2013-03-19 1 views
0

클래스 개체의 벡터가 있습니다. 함수는 무작위로 두 요소를 선택하고 그 주소를 반환합니다.요소 주소에 대한 벡터 푸시 백 효과

이제이 두 요소를 사용하여 동일한 클래스의 두 개의 새 객체를 생성하고 push_back을 사용하여 벡터에 추가하려고합니다.

두 부모 요소의 주소는 다음과 같습니다.

여기에서 문제가 없습니다. 그런 다음 첫 번째 자식 객체가 생성되고 vector_pushback을 사용하여 벡터의 끝에 추가합니다. 문제는 push_back 명령을 실행 한 후에 상위 개체의 주소가 변경되는 것입니다. 다음은 push_back 이후의 디버거 상태입니다.

알다시피 주소는 동일하지만 push_back 이후 가비지 값을 가리키는 것처럼 보입니다. 필자의 이해를 돕기 위해 push_back은 벡터 끝에 요소를 추가합니다. 따라서 나는 두 요소의 주소가 전혀 변하지 않을 것으로 기대한다.

무엇이 잘못 되었나요?

답변

7

TL; DR 버전 :

An insertion operation can invalidate any pointers, references or iterators to elements of a std::vector.

전체 설명 : 원소의 개수이다

  • size :

    std::vector 두 유용한 메트릭스 저장된.

  • capacity이며, 현재 저장할 수있는 요소의 수입니다.

capacity >= size.

capacity은 동적으로 내부적으로 할당 된 내부 배열의 길이입니다. * 요소를 삽입하면 size이 1 씩 증가합니다. 그러나 capacity에 도달하면 더 큰 새 배열을 할당해야합니다 (따라서 capacity가 증가합니다). 이렇게하려면 모든 요소를 ​​복사하고 원본을 삭제해야합니다. 그래서 모든 주소가 바뀝니다.


* 이것은 일반적인 내부 구현 인 std::vector입니다.

+0

TL; DR, +1 어쨌든 –

+0

와우, +2 버튼이 있었으면합니다. –

2

push_back 캔은 재 할당 현재 요소의 저장을 위해 할당있어 공간이 새로운 요소를 포함 할 수없는 경우, 벡터의 모든 요소의 이동이 발생합니다.