Estoy en proceso de transferir algún código de Objective C a C++. No estoy tan familiarizado con los patrones de diseño C++ como con el Objetivo C. En el mundo Cocoa, existe el patrón muy común de escribir un método de fábrica que devuelve un objeto "liberado automáticamente". Algo tan simple como:Objective C "liberación automática" en C++: ¿forma estándar de controlar la duración del objeto?
- (MyClass *)load {
MyClass* obj = [[MyClass alloc] init];
return [obj autorelease];
}
Esto es simple y fácil de entender. El método posee la memoria que asigna, pero puede devolvérselo a la persona que llama, al tiempo que renuncia a la propiedad. No tiene que saber o preocuparse por lo que hace la persona que llama con esa memoria. Si lo conserva, el objeto sobrevivirá. Si se ignora por completo, la memoria se liberará en algún momento después de que se desenrolla la pila de llamadas actual.
Me estoy acercando a esto con cierta inquietud en C++, porque su entorno no contado no parece tener nada tan limpio como autorelease
, o cualquier tipo de política de propiedad que esté tan bien definida como las del Marcos de cacao. ¿Cuáles son las mejores prácticas para este tipo de patrón en C++?
Conozco auto_ptr, pero también existen muchas preocupaciones con respecto a su uso, y parece tener demasiadas deficiencias para ser tan omnipresente como autorelease
(semántica de copia extraña, no admite matrices, incompatibilidad con contenedores STL , etc.)
Los punteros inteligentes Boost también son un candidato obvio, y algunos incluso implementan su propio recuento de referencias. Me parece un poco extraño tener que apoyarme en una biblioteca de terceros para algo tan mundano.
Otra opción que apesta a C sería solo no liberar la memoria devuelta, pero indicar a través de la convención de nombres comúnmente adoptada que la persona que llama ahora es propietaria del objeto devuelto. Esto parece un poco arcaico, y es propenso a fugas invisibles si la persona que llama accidentalmente ignora el valor de retorno.
"Me parece un poco extraño tener que apoyarme en una biblioteca de terceros por algo tan mundano". Acostumbrarse a él. Así es como se hacen las cosas en C++: encuentras bibliotecas que hacen lo que necesitas y las usas. La propiedad de la memoria no es sintáctica en C++; es * siempre * manual. –