2010-08-11 2 views
2

아래 "삭제"문은 객체를 "이중으로 해제"합니까? erase() 문 위의 객체의 소멸자를 호출해야하고 이미 해제하기 때문에 "delete"문이 객체를 이중으로 해제합니까?

(...object_list is a global vector<object*>...) 

vector< object * >::iterator  it, eit, iter; 
object *p_object; 
vector< object * > dead_objects; 

it = object_list_.begin(); 
eit = object_list_.end(); 

//---collect pointers of all dead objects to dead_objects vector 
for (; it != eit; it++) 
{ 
    p_object = *it; 
    if (p_object->is_dead() == false) 
     continue; 

    dead_objects.push_back(p_object); 
} 

//---free every dead object from the global object_list 
for (iter = dead_objects.begin(); iter != dead_objects.end(); iter++) 
{ 
    p_object = *iter; 

    it = object_list_.begin(); 
    eit = object_list_.end(); 

    for (; it != eit; it++) 
    { 
     if (*it != p_object) 
      continue; 

     object_list_.erase(it); 
     delete p_object; 
     break; 
    } 
} 

나는 그것을해야하지, 질문을?

답변

2

erase()는 개체의 소멸자를 호출 않지만, (예 object * 여기) 포인터 타입의 소멸자는 아무것도하지 않는다 - 그것은 포인터에 삭제 호출하지 않습니다. 삭제를 호출하려면 호출 삭제를 수행하는 객체 (예 : auto_ptr<object *>)를 사용해야합니다.

+0

답변 해 주셔서 감사합니다 !! 다른 프로그램에서 나는지도 을 사용하고지도에서 객체 *를 제거하기 위해 erase()를 호출 한 후 객체를 역 참조 할 때 프로그램이 중단 되었기 때문에 질문이있었습니다. (나는 VC++ 6을 사용하고있다.) 벡터 .erase()가 객체를 해제하는지 궁금하다. – cow

0

그렇지 않습니다. 객체에 대한 포인터 벡터가있는 경우, erase()를 호출하여 벡터 중 하나를 제거하면 포인터가 벡터에서 제거됩니다. STL 컨테이너는 주로 값으로 개체를 수집하도록 설계 되었기 때문에 사용자가 직접 삭제해야합니다.

몇 가지 제안 사항 - 모든 벡터를 반복적으로 반복하지 않고 std::find과 같은 STL 알고리즘을 사용하면 IMO 코드가 명확 해집니다. dead_objects와 object_list의 차이점은 무엇인지 모르겠습니다. 임시 벡터에 저장하면 아무 것도 얻지 못하지만, 코드를 SO로 복사 할 때 어떤 것이 손실되었을 수 있습니다. 그리고 std::vectorerase이 선형 시간으로 실행되기 때문에 이처럼 많은 임의 지우기에 적합하지 않습니다. std::remove 다음에 erase이 더 효율적인 접근 방법입니다. 예를 들어 :

for(vector<object*>::iterator it = object_list.begin(); it != object_list.end(); ++it) { 
    if((*it)->is_dead()) { 
     delete *it; 
     *it = NULL; 
    } 
} 
object_list.erase(std::remove(object_list.begin(), object_list.end(), NULL), object_list.end()); 
+0

답변 해 주셔서 감사합니다. 마지막 문장이 아닙니다. object_list.erase (std :: remove (object_list.begin(), object_list.end(), NULL), object_list.end()); 죽거나 살아있는 모든 개체를 지우시겠습니까? – cow

+0

아니오 -'remove'는리스트에서 모든 원소를 NULL과 같게 제거하고 마지막 유효 원소 바로 뒤의 반복자를 반환합니다. 'erase' 호출은 벡터를이 새로운 길이로 절단합니다. – Peter

+0

나는 그것을 얻었다. 잘린 트릭을 주셔서 감사합니다 !! – cow

관련 문제