2012-01-14 2 views
1

컨테이너가 C++에서 어떻게 구현되는지 이해하는데 어려움이 있습니다. 특히 스택에 할당 된 데이터와 힙에 할당 된 데이터를 어떻게 처리 할 수 ​​있습니까? 예 :컨테이너 클래스에 동적으로 할당 된 메모리 다루기

vector<int> VectorA; 
VectorA.push_back (1); 
VectorA.push_back (2); 
VectorA.push_back (3); 

vector<int*> VectorB; 
VectorB.push_back (new int (1)); 
VectorB.push_back (new int (2)); 
VectorB.push_back (new int (3)); 

VectorB의 정수가 제대로 삭제되는지 확인하는 방법은 무엇입니까? 어딘가에 std :: vector는 소멸자를 호출하고 실제로 아무것도 삭제하지 않는다는 것을 기억합니다. 또한 내 자신의 LinkedList 클래스를 구현하려는 경우이 특정 문제를 어떻게 처리할까요?

+1

후자의 경우 스마트 포인터를 사용하지 않으면 벡터에서 항목을 제거하는 모든 곳에서 포인터로 참조되는 객체를 삭제해야합니다. 포함하는 클래스가 파기되기 전에 이것을 수행해야합니다 (참조 된 객체를 삭제하십시오). – Joe

답변

4

문제를 해결하는 가장 좋은 방법은 원시 포인터 대신 컨테이너의 요소로 Smart Pointers을 사용하는 것입니다.
그렇지 않으면 수동으로 do the memory management yourself입니다.

+1

복사가 지원되는 스마트 포인터 (컨테이너가 내부적으로 복사본을 만들기 때문에)는 boost :: shared_ptr처럼 사용하십시오. 예를 들어 컨테이너 복사 의미와 호환되지 않기 때문에'std :: auto_ptr'을 사용하지 마십시오. –

+0

@ RemyLebeau-TeamB std :: auto_ptr은 이제 더 이상 사용되지 않습니다. 나는 Als가 그것을 추천하고 있는지 확신하지 못한다. std :: unique_ptr 또는 std :: shared_ptr를 사용할 수 있습니다. – Jagannath

+0

물론, 많은 사람들은 아직 최신 C++ 표준을 사용하는 컴파일러를 사용하지 않고 있습니다. –

2

벡터에 저장된 오브젝트는 어쨌든 (벡터에 의해 할당 된 공간에) 힙에 저장됩니다.

벡터 외부에서 어떻게 든 관리하려는 경우가 아니면 개체를 개별적으로 할당 할 때 이점이 거의 없습니다 (옵션 B). 이 경우 벡터는 포인터가 저장 한 포인터를 파괴하고 실제 소유자가 객체 자체를 파괴 할 수 있다고 믿을 수 있습니다.

0

짧은 대답은 대부분이 그런 것들을 전혀 다루지 않는다는 것입니다. 표준 컨테이너 (예 : std::vector)는 원본 객체를 전혀 저장하지 않습니다. 객체의 복사본을 저장합니다. 관리자는 자신의 복사본을 저장할 저장소를 관리하며 원본 저장소를 관리하는 것은 사용자가 결정합니다.

포인터를 저장하는 경우 기본적으로 포인터가 가리키는 저장소를 관리해야합니다. 컨테이너는 여전히 복사본을 만들고 (저장소 관리) 있지만 포인터가 가리키는 개체가 아니라 포인터의 복사본입니다. 그것은 당신에게 달려 있습니다.

관련 문제