2012-10-14 3 views
2

그래서 여기에 몇 가지 메모리 관리 기법을 구현하려고합니다. 그것의 각각의 반복자와 클래스 "돌풍"의 객체를 포함 할 수 있도록 내 프로그램에서, 나는 STL과 목록을 만들어 : 나는 주위를 둘러 보았다 발견 한C++에서 지우기 기능을 사용하여 stl 목록에서 객체 삭제

list<Blast> blasts; 
list<Blast>::iterator it1; 

는 삭제 기능을 사용하는 경우, 그것은 것 클래스의 소멸자를 호출 한 다음 객체를 가리키는 반복자를 삭제하고 다른 포인터 (반복자)를 반환합니다. 그러나 클래스가 POD이면 소멸자에 대한 호출은 아무 것도하지 않으므로 해당 객체에 저장된 모든 정보가 메모리에 보관됩니다.

Blast *blast; 
blast = new Blast; 

그러나, 나는 여기에서 문제가 발생이 주위에 이동하십시오

, 난 같은 메모리 부족을 닦아 삭제 기능을 사용할 수 있도록 동적으로 객체를 할당하려고 노력했다. 나는 그것에 대해 아무것도 생각하지 않았다, 처음

blasts.push_back(*blast); 

: 내가 목록에 물체를 밀어했을 때, 그것은 단지 내가 포인터를 밀어 수 있습니다. 그래서 나는 계속 :

if(it2->getX() > 600) { 

    delete &it2; 
    it2 = blasts.erase(it2); 

    } 

나는 어떤이가하는 것은 그 다음 객체를 가리키는 된 포인터와 객체에 대한 포인터를 가리키는 가리키는 된 포인터가 삭제 있다는 것을, 그때 깨달았다.

메모리 누수가 있는지를 알 수있는 방법이 없기 때문에 그것이 실제로 정확한지 확실하지 않습니다. 그래서 내 질문은 :

그 개체를 가리키는 포인터를 삭제하기 전에 메모리에서 개체를 지우려면 어떻게해야합니까? 내 구현이 맞습니까? 객체를 목록에 밀어 넣는 것과 같은 결과입니까?

답변

1

아니 포인터, 반복자 반복자를 삭제는 객체를 가리키는 및 다른 포인터 (반복자)을 반환합니다.

따라서 해당 개체에 저장된 모든 정보는 메모리에 보관됩니다.

아니요, 사실이 아닙니다.

허 :

내가 목록에 물체를 밀어 시도

, 그것은 나만이 포인터를 밀어 수 있습니다? std::list<Blast>을 갖고 있다면 목록에 Blast*을 저장할 수 없습니다. 유형이 동일하지 않습니다. 목록을 std::list<Blast*>으로 변경 하시겠습니까?

delete &it2;

이, 그것은 반복자를 삭제 잘못된 시도한다

, 하지 목록 요소가에 의미합니다.당신은 여전히 ​​다음 아주 잘못하고 버그를 야기 목록 소유 오브젝트를 삭제하려고 할 것이라는 std::list<Blast>이있는 경우

delete &*it2; 

을하지만 : 요소를 삭제하려면 그것은 당신이 원하는 가리키는.

나는 당신이 단지 std::list<Blast>에 충실해야한다고 생각하며,이 전체 질문을 잊어 버려야한다고 생각합니다. 그것은 요소를 지우는 것이 사실이 아니라는 오해를 기반으로 한 것처럼 보입니다. 문제가있는 경우 Blast 개체에 동적으로 할당 된 메모리를 가리키는 포인터 멤버가있는 경우 Blast에 소멸자를 추가하여 올바르게 정리합니다.

+0

문제를 해결해 주셔서 감사합니다. 나는이 게시물 때문에 지우기 기능이 객체를 파괴하지 않았다는 인상을 실제로 받았다. [link] (http://stackoverflow.com/questions/5274025/doesnt-erasing-stdlistiterator-invalidates-the-iterator-and -destroys-the-ob) – shredmasteryjm

+0

허용되는 응답을 확인하십시오. ** 정의되지 않은 동작이므로 ** (2를 포함하여) 아무 것도 인쇄하지 않는 것이 유효한 결과입니다. 객체는 '지우기'에 의해 파괴되지만 메모리가 사용 된 메모리가 0으로 초기화되었다는 것을 의미하지는 않습니다. 단지 메모리에 아무 것도하지 않고 재사용 될 때까지 더러운 상태로 남기는 것이 더 빠릅니다. –