Newsgroup: it.comp.lang.delphi
Titolo: TStringList, TStrings, Array dinamico e Memory Leak

Ciao a tutti :)
Dunque, applicazione HTTP server fatta con le Indy.
Ricevo delle richieste in HTTP.
Le voglio memorizzare in un'area di memoria per poi processarle tutte
insieme.
Avevo pensato di fare un array dinamico di TStringList
Collection : Array of TStringList;
ma poi per ogni richiesta avrei dovuto fare la creazione di un oggetto di
tipo TStringList.
Siccome poi io non devo far altro che rileggere le informazioni contenute in
ciascun elemento del mio array, ho visto che non ci sono problemi
nell'utilizzare TStrings
Collection : Array of TStrings;
Ora, noto quello che dice l'help al riguardo, cioč di non istanziare
direttamente TStrings e che contiene solo metodi astratti, cosa mi
consigliate?
Faccio il bravo ragazzo e mi istanzio e poi mi preoccupo di fare la Free di
tutte le mie TStringList, oppure uso i TStrings visto che li uso solo come
contenitori di dati e non ne sfrutto nessun metodo?
Grazie, ciao

io userei tstringlist.
Magari, in corso d'opera ti puo' venir fuori che ti fa comodo usare un
metodo che in TStrings è abstract.
Inoltre, sono scettico sull'uso della memoria per questo tipo di lavoro.
Cosa succede se il numero di richieste è molto elevato oppure non hai un ups
e perdi delle richieste?
ad esempio, in 2 progetti ho avuto un problema analogo, ma NON DOVEVO
PERDERE NEANCHE UN BIT.
Ho usato un Tclinetdataset come cache dove ogni record è composto da un
campo autoinc ed un memo che contiene il testo della richiesta.
Per blindare il tutto in caso di ambito multithreading, ho incapsulato un
clientdataset in una mia classe che eredita da tcriticaslsection.
Bye
A

 uso solo come contenitori di dati e non ne sfrutto nessun metodo?
Non ho ben capito cosa intendi. Puoi anche istanziare una classe di
tipo TStrings, ma poi se chiami un metodo abstract ricevi l'eccezione
EAbstractError. In tutti i case gli oggetti che crei devi distruggerli.
ciao
guastatore

 uso solo come contenitori di dati e non ne sfrutto nessun metodo?
Hai dato una vaga occhiata al codice di TStrings? quale dei suoi campi
private e' in grado di memorizzare alcunche'? Mi spieghi poi come
faresti ad aggiungere stringhe a questi poveri TStrings senza usarne
alcun metodo?
Saluti
Paolo Arosio

 oppure non hai un ups e perdi delle richieste?
Il pooling di oggetti per applicazioni critiche è comunque
un'operazione contemplata, anche se le tue obiezioni sono valide. Per
la memoria, un profiler sarebbe molto utile, anche per capire cosa
realmente mettere in pool.
Ciao
Antonio

I miei dubbi vengono dal fatto che il seguente codice funziona :
    Collection2 : Array of TStrings;
procedure TForm1.Button3Click(Sender: TObject);
begin
   SetLength(Collection2, 1);
   Collection2[0] := Memo1.Lines;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
   memo2.Lines := Collection2[0];
end;
Quindi :
- Non ho fatto alcuna create
- Non ho usato (cercato di usare) alcun metodo di TStrings
Tutto qua

> - Non ho fatto alcuna create
La create la fa il memo. Tu non fai altro che far puntare l'elemento 0
dell'array Collection2 alla SringList del Memo1.
maz

 end;
Questo codice incarta ancora di più le cose. Ora, 3 puntatori stanno
puntando alla stessa zona di memoria. Anche se la proprietà Lines si
aggiorna diventando uguale alla Memo1.Lines, è proprio in virtù del
fatto che anche questa punta allo stesso oggetto.
Sei sicuro che in chiusura dell'applicazione tu non abbia ricevuto
alcun Access Violation ?
Il pericolo infatti è proprio questo. Supponi che tu esegua la seguente
istruzione: Memo1.Lines.Free oppure che distrugga il controllo Memo1.
Gli altri due puntatori continuano a puntare sempre a quella zona che
ora è deallocata, risultando in due Access Violation.
Per gli assegnamenti degli oggetti TStrings (e discendenti) è
preferibile usare il metodo Assign o Addstrings (se non ricordo male).
Ciao
Antonio Sanguigni

Tutto chiaro, grazie delle delucidazioni.
In effetti dopo la risposta di maz mi chiedevo cosa sarebbe successo
distruggendo memo1 :)
Come funziona TStrings e TStringList lo so bene, ci ho sbattuto la testolina
a suo tempo, prima di leggere l'help e dopo aver ricevuti i miei bei
Abstract Error (astuto come una volpe).
Solo che oggi facendo quello che ho postato mi erano sorti dei dubbi.
Grazie a tutti , ciao!