Aquí hay otra respuesta (tal vez debería haber editado la primera, pero como tiene un enfoque diferente, pensé que estaría bien tenerlos separados).
Cuando crea un puntero con new
, la memoria está reservada y persiste hasta que llame al delete
, pero la duración del identificador sigue estando limitada al final del bloque de código. Si crea objetos en una función y los agrega a una lista externa, los objetos pueden permanecer seguros en la memoria después de que la función retorna y todavía puede hacer referencia a ellos sin el identificador.
Aquí hay un ejemplo (simplificado) de Umbra, un framework C++ que estoy desarrollando. Hay una lista de módulos (punteros a objetos) almacenados en el motor.El motor puede añadir un objeto a esa lista:
void UmbraEngine::addModule (UmbraModule * module) {
modules.push(module);
module->id = modules.size() - 1;
}
recuperar uno:
UmbraModule * UmbraEngine::getModule (int id) {
for (UmbraModule **it=modules.begin(); it != modules.end(); it++) {
if ((*it)->id == id) return *it;
}
}
Ahora, puedo añadir y obtener módulos sin conocer sus identificadores:
int main() {
UmbraEngine e;
for (int i = 0; i < 10; i++) {
e.addModule(new UmbraModule());
}
UmbraModule * m = e.getModule(5); //OK
cout << m << endl; //"0x127f10" or whatever
for (int j = 0; k < 10; j++) {
UmbraModule mm; //not a pointer
e.addModule(&mm);
}
m = e.getModule(15);
cout << m << endl; //{null}
}
Los módulos La lista persiste durante toda la duración del programa, no es necesario que me preocupe la duración de los módulos si se crean instancias con new
:). Entonces eso es básicamente todo: con los punteros, puedes tener objetos de larga vida que nunca necesitan un identificador (o un nombre, si lo deseas) para referenciarlos :).
Otro ejemplo agradable, pero muy simple es la siguiente:
void getVal (int * a) {
*a = 10;
}
int main() {
int b;
getVal(&b);
return b;
}
que no tienen que eliminar el puntero en sí, así como la referencia no elimina automáticamente el objeto referenciado. ¿Estás seguro de que no estás confundiendo referencias y valores/objetos? – DaVinci
Estoy bastante seguro de la diferencia entre la diferencia entre valor/referencia. Mi problema es cuándo declarar un objeto como un puntero y pasar el puntero, o declararlo como un valor y pasar su referencia. – rafaelxy