Respuesta simple (con ejemplos):
Al hacer
Resultado: = vStrList
se asigna a vStrList resultado. ¡En este momento, vStrList y Result SON LO MISMO! Entonces, en la siguiente línea de código, cuando liberas vStrList, también liberas Resultado (bueno, esto no es TÉCNICAMENTE preciso pero lo usé para mantener la explicación simple). Es por eso que obtienes un AV cuando intentas usar el resultado de la función. El resultado se destruyó cuando liberaste vStrList.
Por lo tanto, esto va a resolver su problema:
function FuncStringList:TStringList;
begin
Result := TStringList.Create;
// Do stuff with Result
// never free (here, in this function) the Result
end;
El llamador de FuncStringList tendrá que liberar "Resultado".
Se llaman así:
myStringList := FuncStringList;
try
myStringList.Items.Count
finally
freeandnil(myStringList); <------------- NOW you can free "Result"
end;
.
Otro ejemplo:
function makelist: tstringlist;
begin
result := tstringlist.create;
result.add('1');
result.add('2');
end;
procedure TForm1.Button_GOOD_Click(Sender: TObject);
var list : tstringlist;
begin
list := makelist;
DoStuff(list);
list.free; //ok
end;
procedure TForm1.Button_BAD_Click(Sender: TObject);
begin
listbox1.items.Assign(makelist); // <---- memory leak here because you forgot to free
end;
me puso esta nota aquí antes de que alguien va a empezar 'picking' en mi explicación. Usé algunos 'accesos directos' en mi explicación para evitar conceptos complejos (como la asignación de punteros) para mantener las cosas muy simples. @gath hizo una pregunta básica, lo que significa que todavía está aprendiendo los principios básicos de la programación.
cuidado. Como las variables asignadas a la pila no se inicializan en 0, y las asignadas() solo comprueban <> nil, si no se puede crear antes de llamar, la función * no * activará la afirmación. –
Buena captura, Mason. Lo corregiré en mi publicación. –