Newsgroup: it.comp.lang.visual-basic
Titolo: Free di una struttura

In 
vb.net
 ho una struttura del tipo:
structure k
  dim r as long
  dim t as string
end structure
structure b
  dim y() as k
  dim ny  as integer
end structure
structure a 
  dim x() as b
  dim nx  as integer
  dim z() as c
  dim nz  as integer
end structure
dim o as a
Secondo voi qual'è il modo migliore e soprattutto corretto di effettuare
il "free" della memoria utilizzata da questa struttura.
Ad esempio se setto o a nothing, ho liberato tutta la memoria, o i
riferimenti dei vettori dinamici all'interno restano attivi e il GC non
rilascerà mai la memoria allocata?
Inoltre come posso sapere se o non è mai stato inizializzato visto che
lo posso settare a nothing ma non posso utilizzare "is nothing".
Grazie
Emanuele
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 lo posso settare a nothing ma non posso utilizzare "is nothing".
Leggo dalla guida MSDN
"Non è possibile inizializzare il valore di un membro dati di una struttura
nell'ambito della relativa dichiarazione."
Quindi una struttura non va istanziata.
Infatti se scrivo o.
nella palet non compare il metodo dispose,
o altri metodi dopo che si è istanziata una classe.
Se assegno dei valori alla struttura,
per leggerli non devo interrompere il passaggio tra procedure.
Interrotto,  presumo che la struttura esca dalla visibilità.
Per aiutare il GC, si utilizza il metodo dispose,
ma in definitiva è il GC, a sua insindacabile decisione, anche se si
utilizza dispose o nothing, che decide quando eliminare l'istanza.
Presumo che per le strutture non sia necessario nessun nothing.
Aggiungo che le variabili hanno un valore di default
Infatti
Dim o As k
Dim tt As Int64 = o.r
restituisce 0
Ave
giuseppeD

 giuseppeD
messaggio personale per giuseppe: lo sai che da un po' di tempo in qua
faccio fatica a seguire le tue spiegazioni?
messaggio relativo al thread: le strutture, in 
vb.net
, non erano value type?
se sě, mi sembra non ci sia nessun modo per liberare la memoria che
occupano, tranne che uscire dal loro scope.
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 occupano, tranne che uscire dal loro scope.
Si una struttura è un value type, a differenza delle classi che sono
reference type.
Quindi un tipo definisce un valore e le operazioni che sopporta,
ovvio perchè un tipo non necessita di tutte le caratteristiche che ha
bisogno un oggetto.
Quindi il tipo contiene un valore e no un riferimento( all'indirizzo di
memoria dell'oggetto)
Infatti le strutture non ereditano e non possono essere ereditati.
Una copia, per il value type, copia il valore,
il reference l'indirizzo.
Spero di essere stato chiaro,
sempre se ho capito la differenza tra il il value e il reference type
Ave
giuseppeD

 wrote in message
news:j81Xb.229518$
VW.92...@news3.tin.it
Va bene vediamo di chiarire il problema con un esemio:
dim o1 as a
dim o2 as a
redim o1.x(10)
o1 =o2
la memoria allocata per x che fine fa?


 o1 =o2
forse
o2 =o1
Meglio se semplifichiamo.
Propongo il seguente esempio:
Costruzione di una classe e di una struttura:
Friend Class PuntamentoClasse
    Friend x As Int32
    Friend y As Int32
    'costruttore
    Friend Sub New(ByVal x As Int32, ByVal y As Int32)
        Me.x = x
        Me.y = y
    End Sub
End Class
Friend Structure PuntamentoStructure
    Friend x As Int32
    Friend y As Int32
    'costruttore
    Friend Sub New(ByVal x As Int32, ByVal y As Int32)
        Me.x = x
        Me.y = y
    End Sub
End Structure
'Quidi assegno,leggo, modifico, leggo i valori
  Private Sub Button7_Click
'Punto ad una classe, quindi un riferimento type
        Dim c As New PuntamentoClasse(5, 7)
        Dim c2 As PuntamentoClasse = c
        Console.WriteLine(c2.x & " / " & c2.y)
        c.x = 15
        c.y = 17
        Console.WriteLine(c2.x & " / " & c2.y)
'ottengo
'5 / 7
'15 / 17
'Punto ad una struttura, quindi un valore type
        Dim p As New PuntamentoStructure(5, 7)
        Dim p2 As PuntamentoStructure = p
        Console.WriteLine(p2.x & " / " & p2.y)
        p.x = 15
        p.y = 17
        Console.WriteLine(p2.x & " / " & p2.y)
'Ottengo
'5 / 7
'5 / 7
    End Sub
Ave
giuseppeD

 la memoria allocata per x che fine fa?
Mmmm... bella domanda :)
Non mi ero mai posto il problema, ma a occhio ti direi che finisce nel
garbage, non essendo più puntata da nessuno.
Altrimenti non potresti fare
Sub MangiaMemoria
    Dim x(0 to 1000000) as byte
End Sub
e di cose così ce ne sono in tutti i programmi scritti in VB: nessuno si
preoccupa di fare un
Erase x prima di uscire dalla sub, eppure VB si riesce a tenere tutto in
ordine.
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 ordine.
I value sono allocati sullo stack, finita la routine, la memoria viene
liberata,
quindi non necessita di GC.
Il dubbio, se scrivo
Friend Structure test
    Friend x As Int32
End Structure
Dim gg As test
Debug.Write(gg.x)
ottengo 0
Quel zero lo tiene in memoria, come valore di default, come penso,
quindi occupa una memoria di 4 byte;
o, essendo privo di valore gli viene assegnato lo 0 al momento della
lettura,
finita la routine si annulla ?
Ave
giuseppeD

 finita la routine si annulla ?
Proviamo a vedere cosa ci dice l'IL prodotto :)
.locals (test V_0)
L_0000: nop
L_0001: ldloca.s V_0
L_0003: ldfld test.x
L_0008: box Integer
L_000d: call Debug.Write
Non molto :( però guarda cosa viene fuori da
Dim gg As test
gg.x = Nothing
L_0000: nop
L_0001: ldloca.s V_0
L_0003: ldc.i4.0
L_0004: stfld test.x
Il compilatore converte il Nothing in una costante Int32 = 0.
Se conosci l'asm il tuo codice produce
00000000 push ebp
00000001 mov ebp,esp
00000003 push eax
00000004 push esi
00000005 xor eax,eax
00000007 mov dword ptr [ebp-4],eax
0000000a nop
Mentre il mio
00000000 push ebp
00000001 mov ebp,esp
00000003 push eax
00000004 push esi
00000005 xor eax,eax
00000007 mov dword ptr [ebp-4],eax
0000000a nop
' gg.x = Nothing
0000000b mov dword ptr [ebp-4],0
Io non conosco l'asm, ma a quanto pare la variabile non inizializzata viene
considerata 0, però non ho idea se in uno strato inferiore sia possibile che
qualcuno ci abbia piantato uno 0 in test.x.


 finita la routine si annulla ?
Proviamo a vedere cosa ci dice l'IL prodotto :)


Dim gg As test
gg.x = Nothing


00000000 push ebp
00000001 mov ebp,esp
00000003 push eax
00000004 push esi
00000005 xor eax,eax

0000000a nop
Mentre il mio
00000000 push ebp
00000001 mov ebp,esp
00000003 push eax
00000004 push esi
00000005 xor eax,eax

0000000a nop
' gg.x = Nothing


Ciao


 End Sub


 qualcuno ci abbia piantato uno 0 in test.x.
Non conosco l'assembly
Penso anch'io che per le variabili senza valore le viene assegnato uno di
default
Presumo che a runtime avvengono delle verifiche
Non riesco a trovare un'articolo, letto tempo fa, dove consigliava di
assegnare un valore alla variabile in dichiarazione.
In particolare per la stringa,
dim str as string=[string].empty
un'articolo interessante per la gestione della memoria
http://www.microsoft.com/italy/msdn/library/default.asp?url=/italy/msdn/libr
ary/library.asp?frame=true
.NET > 
VB.NET
 > Ottimizzazione delle prestazioni in Visual Basic .NET
Ave
giuseppeD

 Non mi è ancora chiaro se in 
vb.net
 il GC la libera.
Si dovrebbe rispondere a fine post.
Come scritto nel post precedente, mi sembra interessante il seguente
articolo:


 > Non mi è ancora chiaro se in 
vb.net
 il GC la libera.
Un ArrayList ha i membri static pubblici (shared in 
VB.NET
),
L'array non ha il metodo dispose.
Essendo una classe va istanziata.
Il GC, se l'oggetto ha subito il dispose, lo libera quando lo ritiene
opportuno,
altrimenti, prima lo mette prima a disposizione e successivamente lo
elimina.
In questo caso forse un Nothing è opportuno
Ave
giuseppeD

 Non conosco l'assembly
leggi assembler
Ave
giuseppeD