2010-05-07 3 views
0

목록 개; ............. ............C++ 목록에 관한 질문

그래서 나는 그것에 많은 개 개체를 추가했습니다. 전화 할 경우 dog.pop_front();

메모리가 자동으로 할당 해제됩니까? 내가 튀어 나온 물건?

그래서

list<Dog*> dog2; 
dog2.push_back(dog.front()); 

를 호출하고 내가 dog.pop_front()를 호출 할 경우 그래서이 작동합니까? Dog를 유형 struct로 가정합니다.

답변

1

당신은이 순서에 대해 물어 계속 :

시간 1에서
list<Dog*> dog2; 
dog2.push_back(dog.front()); // time 1 
dog.pop_front();    // time 2 

, 모두 dog2dog은 동일한 개체에 대한 포인터를 가지고있다.

시간 2에서 해당 개체에 대한 포인터는 dog에서 제거되며 dog2에만 있습니다. 명시 적으로

0

아니요. 할당을 해제해야합니다.

0

아니요, 할당 방법에 따라 delete 또는 free를 호출하여 직접 할당을 해제해야합니다.

0

아니요. Dog 개체의 메모리 할당이 해제되지 않습니다. 할당을 취소하려면 delete 연산자를 사용해야합니다.

0

Dog*을 목록에 삽입하면 포인터 복사본이 만들어지고 목록에 삽입됩니다. 목록에서 팝업 할 때이 포인터에 할당 된 메모리이 릴리스됩니다. Dog 개체에 할당 된 메모리는 목록에서 할당되지 않았으므로 해제되지 않습니다. 너 혼자 풀어야 해.

+0

나는 Naveen을 얻지 못했습니다. 전화 번호 목록 dog2; dog2.push_back (dog.front()); 그리고 나서 dog.pop_front()를 호출 할 것입니다 그러면 작동할까요? – mousey

+0

@mousey : 가능합니다. 주목해야 할 중요한 점은 포인터의 * copy *가리스트에 삽입된다는 것입니다. 팝하면이 사본이 삭제됩니다. – Naveen

3

Dog 개체의 메모리는 이 아니며은 삭제됩니다. 이것은 너 자신을해야 할 것이다.

그러나, 유형 Dog*의 포인터의 메모리뿐만 아니라 그것의 주위에 감싸있는 "목록 노드"개체는 자동 list 클래스에 의해 삭제 될됩니다.

+0

전화 번호 목록 dog2; dog2.push_back (개.앞()); 그러면 dog를 호출 할 것입니다 .pop_front() 그러면 작동할까요? Dog를 유형 struct로 가정합니다. – mousey

+0

@mousey 2 개의 컨테이너가 같은 유형을 유지하면 예. – jweyrich

2

delete ptr를 호출하여 해제 할 때까지 원래 new Dog와 그 개체를 만든 가정

는, 객체는 내가 개를 삭제 돌봐 list<shared_ptr<Dog> >을 제안 해제되지 않습니다.