2012-02-20 9 views
8

Este site estados en "Propiedad, fuentes y sumideros":¿Hay alguna contradicción entre estas dos fuentes acerca de la clase de plantilla `auto_ptr`?

"Al copiar un auto_ptr, se transfiere automáticamente la propiedad de la fuente auto_ptr al objetivo auto_ptr; si el objetivo auto_ptr ya es dueño de un objeto , ese objeto se libera primero. Después de la copia, solo el destino auto_ptr posee el puntero y lo eliminará a su debido tiempo, mientras que el origen vuelve a un estado nulo y ya no se puede usar para referirse al objeto propiedad. ".

Consideremos ahora la definición de operator=() para la templacte<classX> class auto_ptr, en el capítulo 14, página 368 de BS de El C++ Programming Language Tercera Edición:

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

no puedo ver el operador liberar el objeto dirigido por ptr, en el caso ptr != 0!

+2

Algo más sospechoso: que 'operator =' no devuelve nada. – Mat

+0

@sbi El lenguaje de programación C++ tercera edición – Belloc

+0

¿Cuál es el tipo de 'ptr'? ¿Es eso 'classX *' o 'auto_ptr_guts '? Si es el último, el código anterior sería bastante trivial. – MSalters

Respuesta

4

Sí, eso es definitivamente un error en la última parte del código. El objeto señalado por ptr debe ser delete d antes de que se asigne un nuevo valor a ptr, de lo contrario, se filtrará el objeto apuntado originalmente por ptr.

+0

Curiosamente, incluso en la errata (http://www2.research.att.com/~bs/3rd_printing5.html) la eliminación no se menciona. – Belloc

+0

@ user1042389: Algunos errores se encuentran en las bases de código durante años. – sharptooth

+1

@sharptooth: bases de código especialmente no utilizadas: no es como si el código en C++ PL se extrajera automáticamente del repositorio de una implementación de producción de 'auto_ptr'. –

Cuestiones relacionadas