2011-01-21 14 views
6

Czy można zwiększyć :: smart_ptr, takie jak scoped_ptr i shared_ptr, w kontenerach standardowych, takich jak std :: map?Czy można zwiększyć :: smart_ptr używać w kontenerach standardowych?

class SomeClass 
{ 
    std::map<int,boost::scoped_ptr<SomeOtherClass> > a_map; 
}; 

Jako boost::smart_ptr can be used for polymorphism, czy w tym przypadku jest również prawdą? Czy zniszczenie kontenera spowoduje prawidłowe zniszczenie podklas?

+0

To samo co poprzednio: czy próbowałeś? – BatchyX

+0

@BatchyX - nope. W moim przypadku jest to dużo refaktoryzacji, więc raczej pytam. Poza tym, jeśli odpowiedź nie dotyczy StackOverflow, powinno być :) – Jonathan

+0

Byłem tam, zrobiłem to. Ale nauczyłem się od niego, w większości przypadków można napisać 20-30 liniowych programów testowych, które sprawdzą/unieważnią pomysł w mniej niż 5 minut. 'struct test {~ test() {std :: cout <<" ~ test "<< std :: endl; }}; int main() {wektor > v; v.push_back (make_shared ()); } '(lub coś w tym wierszu, trudno napisać kod w komentarzu). Następnie skompiluj i sprawdź, czy destruktory są wywoływane, czy nie. Spróbuj ponownie za pomocą 'scoped_ptr' i zobacz, czy kod się kompiluje. Wrzuć kilka innych operacji ('resize', ...) i sprawdź. –

Odpowiedz

20

scoped_ptr nie można używać w standardowych pojemnikach, ponieważ nie można ich kopiować (co jest wymagane przez interfejsy kontenerów). Można jednak użyć shared_ptr.

Jeśli nie możesz używać C++ 11 i używasz już zwiększenia, rozważ pointer containers, który będzie działał nieco lepiej niż kontener wspólnych wskaźników.

Jeśli używasz C++ 11, rozważ kontener unique_ptr, który powinien działać podobnie do kontenerów wskaźnika doładowania.

+0

@Dohn Dibling: Win? Od kiedy jesteśmy w konkursie? :) –

Powiązane problemy