Ver Mensaje Individual
  #1  
Antiguo 24-11-2006
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Reputación: 21
AzidRain Va camino a la fama
Funciones que devuelven objetos

En un proyecto que estoy haciendo se me ocurrió una función que me devolviera un objeto pero me encuentro en una interrogante: Si devuelve un objeto...¿Quien lo crea? la función o quien llama a la función?

Código Delphi [-]
Function GetTabla(nombre:String):TDataset;
var aTabla: TDataset
Begin
    aTabla := Tdataset.create(nil);
    GetTabla := aTabla;  // devolver la tabla recien creada
                                 // pero entonces...quien la destruye?¡???
                                // no se pierde al salir de la función??
end;
 
Procedure HazAlgo;
var unaTabla: TDataset;
Begin
   unaTabla := GetTabla("datos");   ///<--- Se puede hacer esto???
                                               // Pero si unaTabla no se ha construido?     
end;

Mi Teoría:

Se supone que todas las instancias de un objeto son simples punteros partimos de que en la funcion HazAlgo efectivamente unaTabla, al no crearse no reserva memoria para el objeto TDataset, esto lo hace la funcion GetTabla dentro de su codigo y devuelve el puntero a la memoria recientemente reservada (la funcion no la libera destruyendo el objeto que creo). Entonces asumo que unaTabla apunta al Objeto que cre{o la función, por lo que entonces, tendré que destruir directamente unaTabla para liberarla.

Quedando así:
Código Delphi [-]
Procedure HazAlgo;
var unaTabla: TDataset;
Begin
   unaTabla := GetTabla("datos");   //equivaldría a Tdataset.create(nil)
  Try
    { uso una tabla
     .
     .
     .
     }
  finally
    unaTabla.free; // Libero la memoria
  end;
 end;

Segun mi teoria este último código debe ser completamente válido...pero no lo sé hasta probarlo..

Alguna sugerencia? A lo mejor no estoy descubriendo nada nuevo...
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita