2013-05-23 5 views
2

나는이 점에 대해 내 마음에서 벗어났다.예기치 않은 vector.back() 값

#include <iostream> 
#include <vector> 

int main() { 

    std::vector<int> a; 
    std::vector<int *> b; 

    a.push_back(13); 
    b.push_back(&a.back()); 

    a.push_back(24); 
    b.push_back(&a.back()); 

    for (std::vector<int>::iterator it = a.begin(); it != a.end(); ++it) 
     std::cout << *it << " "; 
    std::cout << "\n"; 

    for (std::vector<int *>::iterator it = b.begin(); it != b.end(); ++it) 
     std::cout << *(*it) << " "; 
    std::cout << "\n"; 

    return 0; 
} 

출력 : 정말 모두 출력 라인이 일치하지 않는 이유를 알고 싶습니다

13 24 
16712910 24 

. 내가 여기서 무엇을 놓치고 있니? 나는 이것을 gcc로 컴파일했다.

+1

벡터 경우 새로운 크기> 용량을 재 할당합니다. – hansmaad

답변

2

두 번째 push_back 동안 요소를 증가시키고 재배치하는 것은 vector이기 때문에 발생했다. 두 번째 push_back을 수행하면 벡터가 용량이 가득 차고 새 공간을 할당하고 요소를 새 메모리로 이동시킬 수 있습니다. 또한 이전에 할당 된 메모리를 해제합니다. 이 해제 된 메모리 위치의 주소를 저장하고 있으므로 가비지 값이 표시됩니다. 이 문제를 해결하려면 a.reserve(2)을 수행하여 push_back 2ints 동안 vector가 재 할당되지 않도록해야합니다.

0

vector 동적 배열을 구현하면 push_back은 어레이가 재 할당 될 수있는 경우 - 메모리 내의 다른 위치로 이동. 그러나 a이 소유 한 배열을 이동하면 b으로 푸시 된 값이 업데이트되지 않습니다. 그들은 no-man 's 땅을 가리키고, b[0]에 접근하는 것은 정의되지 않는 행동을 일으킨다. 이 경우, 임의의 값이 읽 t집니다.

0

초기 (a) 벡터의 크기를 조정하면 b의 요소가 잘못된 값을 가리 킵니다. 작동 여부를 확인하려면 요소를 삽입하기 전에 미리 입력 할 최대 요소를 미리 알아야하고 용량을 설정해야합니다.

0

벡터에 새 요소를 삽입하고 용량을 초과하면 메모리를 다시 할당하고 이전에 얻은 직접 참조는 모두 더 이상 필요하지 않으므로 손상됩니다.

1

a.push_back()에 대한 두 번째 호출은 전체 메모리 양을 재 할당하여 a의 첫 번째 요소의 주소를 변경할 수 있습니다 (이 경우 분명히 않습니다). 따라서 &a[0]은 더 이상 b[0]에 저장된 주소와 일치하지 않습니다.

시도 :

int main() { 
    std::vector<int> a; 
    a.push_back(13); 
    std::cout << &a[0] << endl; 
    a.push_back(24); 
    std::cout << &a[0] << endl; 
    return 0; 
} 

당신이 가장 가능성이 다른 값을 :) 볼 수

관련 문제