2012-02-20 4 views
8

This site stany na „własności, Sources i zlewy”:Czy istnieje sprzeczność między tymi dwoma źródłami o klasie szablonu "auto_ptr"?

„Podczas kopiowania auto_ptr, automatyczne przeniesienie własności ze źródła auto_ptr do celu auto_ptr; jeśli cel auto_ptr już właścicielem obiektu , obiekt ten jest najpierw zwalniany. Po skopiowaniu, tylko obiekt docelowy auto_ptr jest właścicielem wskaźnika i usunie go w odpowiednim czasie, podczas gdy źródło zostanie przywrócone do stanu zerowego i nie może już być używane do odwoływania się do posiadanego obiektu. ".

Rozważmy teraz definicję operator=() dla templacte<classX> class auto_ptr, w rozdziale 14, strona 368 Stroustrup na C++ Programming Language Third Edition:

auto_ptr& operator=(auto_ptr& a) throw() { ptr = a.ptr; a.ptr = 0; }

nie widzę operator uwalniając przedmiot adres: ptr, w przypadku ptr != 0!

+2

Coś innego podejrzanego: że 'operator =' nie zwraca niczego. – Mat

+0

@sbi Język programowania w C++ Third Edition – Belloc

+0

Jaki jest typ 'ptr'? Czy to 'classX *' lub 'auto_ptr_guts '? Jeśli to drugie, powyższy kod byłby dość banalny. – MSalters

Odpowiedz

4

Tak, to zdecydowanie błąd w drugim kawałku kodu. Obiekt oznaczony jako ptr musi być delete d zanim nowa wartość zostanie przypisana do ptr, w przeciwnym razie obiekt pierwotnie wskazywany przez ptr wycieknie.

+0

Co ciekawe, nawet w erracie (http://www2.research.att.com/~bs/3rd_printing5.html) nie wspomniano o usunięciu. – Belloc

+0

@ user1042389: Niektóre błędy występują przez wiele lat w bazach kodu. – sharptooth

+1

@sharptooth: szczególnie nieużywane bazy kodu - nie jest tak, że kod w C++ PL jest automatycznie wyodrębniany z repozytorium implementacji produkcyjnej 'auto_ptr'. –

Powiązane problemy