그래서 여기에 몇 가지 메모리 관리 기법을 구현하려고합니다. 그것의 각각의 반복자와 클래스 "돌풍"의 객체를 포함 할 수 있도록 내 프로그램에서, 나는 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);
}
나는 어떤이가하는 것은 그 다음 객체를 가리키는 된 포인터와 객체에 대한 포인터를 가리키는 가리키는 된 포인터가 삭제 있다는 것을, 그때 깨달았다.
메모리 누수가 있는지를 알 수있는 방법이 없기 때문에 그것이 실제로 정확한지 확실하지 않습니다. 그래서 내 질문은 :
그 개체를 가리키는 포인터를 삭제하기 전에 메모리에서 개체를 지우려면 어떻게해야합니까? 내 구현이 맞습니까? 객체를 목록에 밀어 넣는 것과 같은 결과입니까?
문제를 해결해 주셔서 감사합니다. 나는이 게시물 때문에 지우기 기능이 객체를 파괴하지 않았다는 인상을 실제로 받았다. [link] (http://stackoverflow.com/questions/5274025/doesnt-erasing-stdlistiterator-invalidates-the-iterator-and -destroys-the-ob) – shredmasteryjm
허용되는 응답을 확인하십시오. ** 정의되지 않은 동작이므로 ** (2를 포함하여) 아무 것도 인쇄하지 않는 것이 유효한 결과입니다. 객체는 '지우기'에 의해 파괴되지만 메모리가 사용 된 메모리가 0으로 초기화되었다는 것을 의미하지는 않습니다. 단지 메모리에 아무 것도하지 않고 재사용 될 때까지 더러운 상태로 남기는 것이 더 빠릅니다. –