2014-07-19 5 views
1

나는 벡터의 벡터에 스마트 포인터를 사용하면 문제가 발생하는지 궁금합니다. 다른 컨테이너를 포함한 파생 된 객체를 보유 할 컨테이너 객체를 만들고 있습니다. 사용하고 싶습니다. 자체 삭제를위한 스마트 포인터를 사용하고 unique_ptr을 단일 소유권으로 사용하려고했지만이 경우에는 사용할 수 없습니다.스마트 포인터 또는 벡터의 벡터에 대한 일반 포인터

각 컨테이너에는 크기가 있으므로 마지막 컨테이너에 첫 번째 컨테이너를 포함 할 수 없으므로 shared_pt에 대한 읽기 문제가 발생하지 않습니다.

class Base{...} 

class Item:public Base{...} 

class Container : public Base{ 
    //int size; 
    vector<shared_ptr<Base>>vec; 
public: 
    template <typename D> 
    void AddItem(const D& thing) { 
    vec.push_back(make_shared<D>(thing)); 
    } 
}; 

Container bag; 
Item thing; 
Container bag2; 

bag2.AddItem<Item>(thing); 

bag.AddItem<Container>(bag2); 

// _________________________

관련,하지 왜이 일 첫 번째 경우에

class Container :public Base{ 
vector<Base*>slot; 
public: 
~Container(){} 

void Add(Base* thing){ slot.push_back(thing); } 

void Delte_All() 
{ 
    for(int i=0;i<slot.size();++i) 
    { 
     delete slot[i]; 
     cout << "Object " << i << " deleted" <<endl; 
    } 
    slot.clear(); 
} 

}; 

int main() 
{ 
Container bag; 
Container bag2; 
Base* thing=&bag2; 

bag.Add(thing); 

bag.Delte_All(); 

return 0; 
} 
스마트 포인터와
+2

당신은'std :: vector >>'을 사용할 수 있습니다. –

답변

1
  • 없음 문제 (예를 들어,., shared_ptr).
    참고로 make_shared<Item>(thing)으로 전화하면 thing이 힙에 복사됩니다.

    (원시 포인터) 두 번째 경우에
  • , bag2 스택, 의 개체입니다 당신은 스택에 할당 된 개체를 삭제할 수 없습니다. (*)

관련 문제