Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C#] Stack e Heap, quando usare l'uno e quando l'altroi?

    Salve ho appena iniziato a studiare il C#, dopo aver studiato il C e il C++, e mi sono imbattuto nell'operatore new, il quale avevo già visto con il C++, solo che nello C# se ne fa più uso, almeno il libro che sto leggendo io.

    Ho capito la sua funzione, ossia che a differenza di un'allocazione classica come int x, la quale viene allocata nella memoria stack della RAM, la dichiarazione int x = new int, viene allocata nella memoria heap della RAM.

    Conosco anche la differenza tra stack e heap, solo che non riesco a capire quando si deve usare l'uno e quando l'altro.
    Se qualcuno mi potrebbe fare un esempio pratico sarebbe l'ideale.

    Grazie

  2. #2
    http://msdn.microsoft.com/en-us/libr...=vs.90%29.aspx

    In sostanza, qualunque istanza di classe viene necessariamente allocata nell'heap, mentre le struct e i tipi primitivi vengono allocati sullo stack, per cui, salvo questioni di boxing/unboxing, il problema normalmente non si pone.

    (per inciso, C# viene trattato nella sezione Visual Basic e .NET Framework, dove sposto la discussione )
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ok grazie, non lo sapevo.

    Comunque tornando al discorso, ho visto varie volte usare l'operatore new anche sui tipi primitivi, ma se mi dici così allora quello che ho visto era solo a scopo illustrativo, non avevano alcuna utilità o sbaglio?

    Poi ho studiato anche il boxing, ossia convertire un tipo (credo primitivo) in un object una sorta di "scatola" e l'unboxing, ovvero la funzione inversa del boxing convertire un object nel tipo che era prima.
    Ma la domanda è a cosa serve convertire una varabile in un object?

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Quote Originariamente inviata da Pirand92 Visualizza il messaggio
    Ok grazie, non lo sapevo.

    Comunque tornando al discorso, ho visto varie volte usare l'operatore new anche sui tipi primitivi, ma se mi dici così allora quello che ho visto era solo a scopo illustrativo, non avevano alcuna utilità o sbaglio?

    Poi ho studiato anche il boxing, ossia convertire un tipo (credo primitivo) in un object una sorta di "scatola" e l'unboxing, ovvero la funzione inversa del boxing convertire un object nel tipo che era prima.
    Ma la domanda è a cosa serve convertire una varabile in un object?
    I tipi primitivi sono degli structs quindi si possono istanziare anche con new(esempio per un array new int[1024]), con un object hai un oggetto generico da poter riutilizzare tramite un cast esplicito dove vuoi.
    Ultima modifica di RoTeam; 17-08-2014 a 02:37

  5. #5
    ok, ho capito l'uso degli object anche se non mi viene al momento in mente nessun esempio pratico per cui mi possa servire. Però ho capito meglio l'antifona. Solo che continuo ancora a rimanere perplesso sull'uso dell'operatore new, ossia capisco che alloca la memoria non in stack, con la metodologia LIFO, ma nell'heap, solo vorrei capire che benefici porta memorizzare nella heap rispetto alla stack. Se non mi sono spiegato ditemelo e cercherò di spiegarvelo meglio.

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Quote Originariamente inviata da Pirand92 Visualizza il messaggio
    ok, ho capito l'uso degli object anche se non mi viene al momento in mente nessun esempio pratico per cui mi possa servire. Però ho capito meglio l'antifona. Solo che continuo ancora a rimanere perplesso sull'uso dell'operatore new, ossia capisco che alloca la memoria non in stack, con la metodologia LIFO, ma nell'heap, solo vorrei capire che benefici porta memorizzare nella heap rispetto alla stack. Se non mi sono spiegato ditemelo e cercherò di spiegarvelo meglio.
    Nello stack la memoria viene liberata alla fine della funzione mentre l'heap è gestito dalla garbage collection oppure tramite l'interfaccia IDisposable, C# gestisce ogni oggetto come una referenza da aggiungere all'heap mentre gli structs(anche primitivi) e gli enum valori da inserire nello stack.

  7. #7
    Quote Originariamente inviata da RoTeam Visualizza il messaggio
    Nello stack la memoria viene liberata alla fine della funzione mentre l'heap è gestito dalla garbage collection oppure tramite l'interfaccia IDisposable, C# gestisce ogni oggetto come una referenza da aggiungere all'heap mentre gli structs(anche primitivi) e gli enum valori da inserire nello stack.
    Quindi con l'operatore new decido io quando liberare la memoria (a seconda di dove e quando mi serve) usando ovviamente l'operatore delete. Mentre con la stack lo decide la fine dl blocco (tranne che con le variabili static, ma quella è un'altra cosa).

    Giusto od ho sbagliato qualcosa?

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Quote Originariamente inviata da Pirand92 Visualizza il messaggio
    Quindi con l'operatore new decido io quando liberare la memoria (a seconda di dove e quando mi serve) usando ovviamente l'operatore delete. Mentre con la stack lo decide la fine dl blocco (tranne che con le variabili static, ma quella è un'altra cosa).

    Giusto od ho sbagliato qualcosa?
    Ti stai confondendo col c++, in c# non esiste l'operatore delete ma viene gestito dalla garbage collection e tramite Dispose() puoi liberare delle risorse(Bitmaps,Sockets,etc...) mentre con GC.Collect() puoi forzare questo processo. In c# di solito non ricevi mai la memoria direttamente allocata da new ma quella che ti passa il GC o il metodo nativo, ad esempio se allochi tramite Marshal dovrai liberare il puntatore sempre tramite Marshal, in pratica non hai mai un accesso diretto alla memoria perché sei in un ambiente managed(con unsafe al massimo puoi gestire i puntatori).

  9. #9
    ok, ho capito. Non tutto ma buona parte, il resto devo andare a studiarmi un po' di cose.
    Grazie.

  10. #10
    Edit: allora mi è venuto in mente che in C# il garbage collection libera in automatico la memoria dal contenuto di una variabile, non appena questa smette di essere usata. Pensa che scemo l'avevo anche letto e me ne sono ricordato solo ora.

    Grazie comunque per il vostro aiuto.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.