2011-06-13 2 views

답변

1

예, 모두 올바르게 정리됩니다. 0

의 크기의 컨테이너를 떠나, 자신의 소멸자가 호출 된 후, 그들은 벡터 컨테이너에서 제거됩니다

this link에서 :

벡터의 모든 요소는 삭제됩니다

a.clear() 모든 ELEM을 파괴 :

곧 표준의 [sequence.reqmts] 섹션이 명확하게 a에있는 요소는 a의 요소를 참조하는 모든 참조, 포인터 및 반복기를 무효화하고 과거의 이터레이터를 무효화 할 수 있습니다.

5

정확히 "동적으로 할당 하시겠습니까?" vector<foo>을 사용하면 괜찮습니다. vector<foo*>을 통해 포인터를 넣는다면 포인터는 소멸자 그 자체를 갖지 않기 때문에 소멸자가 호출되지 않습니다.

참고 그러나 vector<foo> 경우에, 당신은 찾을 수 귀하의 생성자와 소멸자는 예를 들어, 예상 한 것보다 더 많은라고 벡터가 크기가 조정되면 벡터는 필요할 때 메모리에서 객체를 이동할 때 벡터를 사용하기 때문입니다. 참조 카운트 부기에 의한 작은 반환 한 비용이 있지만 당신은 그 주위에 얻을 수있는 부스트 shared_ptr를 사용할 수 있습니다.

내 조언 : 객체가 복사 및 파괴가 저렴하면 vector<foo>을, 비싸거나 하드/불가능한 경우 vector<shared_ptr<foo> >을 사용하십시오. 벡터가 메모리 관리를 처리하지 않도록 특별히주의하지 않는 한 vector<foo*>을 사용하지 마십시오. IMHO는 거의 좋은 아이디어가 아닙니다.

+0

당신이 컨테이너에 객체를 이동을 사용하는 경우; 컨테이너의 객체는 유지되지만 파손해서는 안됩니다. 그러면 어떻게됩니까? – this

+0

원래 답은 std :: move()가 일반적으로 사용되기 전에 작성되었습니다. 그 물체는 여전히 파괴 될 것입니다. 이것은 실제로 일반, IIRC의 경우입니다 - 객체가 그들이 "부터 이동"과 소멸자가 적절히 동작하도록했습니다 시점을 추적 할 것으로 예상된다. 유일한 까다로운 부분은 아무도보고되어 있지 않은지있는 이동-에서 요소의 상태가 새 값을 할당되거나 파괴 될 때까지. –

관련 문제