Funkcja Boost's make_shared()
może być wyjątkowo bezpieczna podczas próby utworzenia shared_ptr
.Dlaczego funkcja boost nie ma funkcji make_scoped()?
Dlaczego nie ma odpowiednika w postaci make_scoped()
? Czy istnieje wspólna najlepsza praktyka?
Oto przykładowy kod z boost::scoped_ptr
documentation że wydaje się niebezpieczne dla mnie:
boost::scoped_ptr<Shoe> x(new Shoe);
Ta linia kodu zrobi te trzy rzeczy w celu:
- przydzielić pamięci sterty dla
Shoe
- Zadzwoń do konstruktora pod numer
Shoe
- Wywołanie konstruktora dla
boost::scoped_ptr<Shoe>
Jeżeli konstruktor Shoe
zgłasza wyjątek,
pamięć będzie przeciekał.
(patrz odpowiedź R. Martinho Fernandesa)scoped_ptr
nie zajmie się dealokacją, ponieważ nie została jeszcze zbudowana.
Czy to przeoczenie? Czy istnieje rozwiązanie, którego nie zauważyłem?
Ten przykład jest bezpieczny, ale taki, który nie jest: 'f (boost :: scoped_ptr (new Shoe), g());'. Praktyka kodowania w celu rozwiązania problemu: Zawsze wymieniaj inteligentne wskaźniki jako zmienne lub elementy, nie twórz ich jako tymczasowych wyrażeń. –
aschepler