ONE QUESTION AT A TIME.

천천히 생각하고, 분명하게.

TODAY’S QUESTION305 / 1500
언어·런타임난이도 중하5분 답변 목표 · 보강본

C++ vector의 원소 포인터를 보관한 뒤 push_back을 했습니다. 언제 포인터와 iterator가 무효화되나요?

잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?

답변과 점검 포인트 펼치기답변 접기
01

구두 답변

정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.

vector가 용량을 넘어 재할당하면 기존 저장소가 바뀌어 원소에 대한 포인터·참조·iterator가 무효화됩니다. 재할당이 없어도 삽입·삭제 위치와 end iterator 등 무효화 규칙이 연산별로 다릅니다.

동작 원리와 전제

reserve는 예상 크기 안 재할당을 줄일 수 있지만 영구 안정성을 보장하지 않습니다. 원소를 삭제하면 뒤 원소 이동으로 같은 주소가 다른 논리 객체를 뜻할 수도 있습니다. 메모리가 남아 보인다고 참조가 유효한 것은 아닙니다.

선택과 실패 처리

안정적인 객체 수명이 필요하면 소유 객체를 별도 할당하고 ID·핸들로 접근하거나 적합한 컨테이너를 선택합니다. list나 deque도 모든 iterator·참조 규칙이 동일한 것은 아니므로 필요한 연산과 라이브러리 계약을 확인합니다.

구체적인 사례와 검증

vector의 capacity가 충분해 push_back에서 재할당이 없으면 기존 원소 참조를 유지할 수 있는 경우가 있지만 end iterator는 달라질 수 있습니다. 중간 erase는 뒤 원소를 이동시켜 같은 인덱스가 다른 원소를 뜻하게 합니다. 따라서 단순히 포인터가 아직 접근 가능한 메모리를 가리키는지와 논리적으로 같은 객체인지도 구분해야 합니다. 비동기 callback에 원소 주소를 넘기면 callback이 끝날 때까지 컨테이너의 이동·삭제를 막거나 독립 소유 객체를 사용합니다. 디버그 빌드에서만 보이는 오류가 사라져도 계약 위반은 남을 수 있어 재할당 경계를 의도적으로 만들고 검사하겠습니다.

용량 경계·중간 삽입·erase·반복자 보관을 sanitizer와 테스트로 확인합니다. reserve로 우연히 오류가 사라진 것을 정확한 수명 설계로 보지 않습니다. 컨테이너의 성능 선택과 외부 참조의 안정성을 함께 평가하겠습니다.

02

득점 포인트

이해가 드러나는 지점을 확인해 보세요.

  • 핵심 구분: vector가 용량을 넘어 재할당하면 기존 저장소가 바뀌어 원소에 대한 포인터·참조·iterator가 무효화됩니다.
  • 선택 조건: 안정적인 객체 수명이 필요하면 소유 객체를 별도 할당하고 ID·핸들로 접근하거나 적합한 컨테이너를 선택합니다.
  • 검증 기준: 용량 경계·중간 삽입·erase·반복자 보관을 sanitizer와 테스트로 확인합니다.
03

감점 포인트

놓치기 쉬운 조건과 오해를 짚어 보세요.

  • reserve 한 번이나 현재 capacity가 모든 이후 참조를 영구 보호한다고 한다.
04

더 파고들 거리

하나 더 질문하며 이해의 범위를 넓혀 보세요.

  • 확장 한 번의 O(n) 지연과 전체 append의 상환 비용은 어떻게 다르게 측정하나요?
  • 삽입 위치를 찾는 비용과 노드·배열의 참조 수명을 포함하면 어떤 구조가 맞나요?
  • 공유 소유권이 객체를 살려 두는 것과 필드 동시 수정의 안전성은 어떻게 다른가요?

득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.

원리부터 공부하고 싶다면

답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.

← 전체 질문 보기