2012-06-17 6 views
1

벡터에서 개체 포인터를 삭제하고 지울 필요가 있습니다. 이 질문이 Should we delete before or after erase for an pointer in the vector?인데 오브젝트 포인터 삭제 후 지울 수 없습니다.벡터에서 개체 포인터를 지우거나 지울 수 없습니다.

문제를 해결하는 방법은 무엇입니까? 여기 내 코드.

#include <iostream> 
#include <vector> 
using namespace std; 

class Foo 
{ 
public: 
    class bar 
    { 
    public: 
     Foo &_owner; 
     int _id; 
     bar(Foo &owner,int id) : _id(id), _owner(owner){} 
     void remove() 
     { 
      for(vector<bar*>::iterator it=_owner.vbar.begin();it<_owner.vbar.end();it++) 
      { 
       if((*it)->_id == _id) 
       { 
        //delete object pointer 
        delete * it; 

        //remove element 
        it = _owner.vbar.erase(it); // error on this line. 
       } 
      } 
     } 
    }; 
    vector<bar*> vbar; 
    Foo() 
    { 
     // add 10 elements 
     for(int i=0;i<10;i++) 
      vbar.push_back(new bar(*this ,i)); 

     // remove element at 3 
     vbar.at(3)->remove(); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    Foo foo; 
    return 0; 
} 

[편집]이 같은 푸 클래스에 벡터에 더 이상 사용을 줄 ID를 추가하지 의해 을 (푸 클래스에 삭제) 외부 바 클래스 삭제 개체 포인터에 의해이 고정 .

#include <iostream> 
#include <vector> 
using namespace std; 

class Foo 
{ 
public: 
    class bar 
    { 
    public: 
     Foo &_owner; 
     int _id; 
     bar(Foo &owner,int id) : _id(id), _owner(owner) {} 
     void remove() 
     { 
      _owner.removeId = _id; 
      _owner.removeHelper(); 
     } 
    }; 
    vector<bar*> vbar; 
    int removeId; 
    Foo() 
    { 
     removeId = -1; 

     // add 10 elements 
     for(int i=0; i<10; i++) 
      vbar.push_back(new bar(*this ,i)); 

     // remove element at 3 
     vbar.at(3)->remove(); 
    } 
    void removeHelper() 
    { 
     for(vector<bar*>::iterator it=vbar.begin(); it<vbar.end(); it++) 
     { 
      if((*it)->_id == removeId) 
      { 
       //delete object pointer 
       delete * it; 

       //remove element 
       it = vbar.erase(it); 
       break; 
      } 
     } 
     removeId = -1; 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    Foo foo; 
    return 0; 
} 
+0

'std :: shared_ptr'은 당신의 친구입니다. –

답변

2

문제는 여기이 경우 delete this에 해당합니다

//delete object pointer 
delete * it; 

을 숨겨집니다.

그런 다음 현재 개체의 일부를 사용하면 정의되지 않은 동작이 발생합니다. 루프의 다음 라운드는 이 아니며이 작동합니다.