Este es un problema de asignación de memoria que nunca he entendido realmente.¿Cuándo no es una buena idea pasar por referencia?
void unleashMonkeyFish() { MonkeyFish * monkey_fish = new MonkeyFish(); std::string localname = "Wanda"; monkey_fish->setName(localname); monkey_fish->go(); }
En el código anterior, he creado un objeto MonkeyFish en el montón, asignándole un nombre, y luego desataron que sobre el mundo. Digamos que la propiedad de la memoria asignada se ha transferido al objeto MonkeyFish, y solo MonkeyFish decidirá cuándo morirá y se eliminará.
Ahora, cuando defino el miembro de datos "nombre" dentro de la clase MonkeyFish, puedo elegir uno de los siguientes:
std::string name; std::string & name;
Cuando defino el prototipo de la función setName() dentro de la clase MonkeyFish , Puedo elegir uno de los siguientes:
void setName(const std::string & parameter_name); void setName(const std::string parameter_name);
Quiero ser capaz de minimizar las copias de cadenas. De hecho, quiero eliminarlos por completo si puedo. Entonces, parece que debería pasar el parámetro por referencia ... ¿verdad?
Lo que me molesta es que parece que mi variable de nombre local va a quedar fuera del alcance una vez que se completa la función unleashMonkeyFish(). ¿Eso significa que estoy obligado a pasar el parámetro por copia? ¿O puedo pasarlo por referencia y "salirse con la suya" de alguna manera?
Básicamente, quiero evitar estos escenarios:
- no quiero para establecer el nombre del MonkeyFish, sólo para que la memoria de la cadena nombre_local desaparecerá cuando la función unleashMonkeyFish() termina. (Esto parece que sería muy malo.)
- No quiero copiar la cadena si puedo evitarlo.
- yo preferiría no nombre_local nueva
¿Qué combinación prototipo y los datos miembro debería usar?
ACLARACIÓN: Varias respuestas sugirieron usar la palabra clave estática para asegurarse de que la memoria no se desajuste automáticamente cuando finalice unMonkeyFish(). Dado que el objetivo final de esta aplicación es liberar N MonkeyFish (todos los cuales deben tener nombres únicos) esta no es una opción viable. (Y sí, MonkeyFish - ser criaturas volubles - a menudo cambian sus nombres, en algún momento varias veces en un solo día.)
EDITAR: Greg Hewgil ha señalado que es ilegal para almacenar la variable nombre como referencia, ya que no se está configurando en el constructor. Dejo el error en la pregunta tal como está, ya que creo que mi error (y la corrección de Greg) podría ser útil para alguien que vea este problema por primera vez.
¿Ha perfilado y determinado que esto es un problema? – CTT
@CTT - No, no lo hice. Sin embargo, parece ineficaz copiar la cadena si puedo evitarla. En general, quiero evitar copiar lo más posible. – Runcible
"monkey_fish" está en el montón, no en la pila. –