Allocazione memoria dinamica: malloc vs new vs HeapAlloc

di il
4 risposte

Allocazione memoria dinamica: malloc vs new vs HeapAlloc

Da tempo mi porto dietro questo dubbio amletico. Sappiamo che in C++ sotto windows ci sono (sostanzialmente) tre metodi per allocare la memoria dinamica:
  • la tradizionale malloc (C standard)
  • l'operatore new (C++ standard, e l'unica utilizzabile con le classi)
  • HeadAlloc (specifica di Windows 32bit)
Mi piacerebbe capire le differenze (strutturali) di queste tre, per poter valutare, di caso in caso, quale è più opportuna usare, e perché.
Ad esempio, come detto, per istanziare una classe va usata la new, la quale oltre a richiedere un'area di memoria al sistema operativo, si occupa di chiamare il costruttore opportuno. Ma per semplici aree di memoria, c'è differenza tra new e malloc?

Prendendo in considerazione la terza possibilità, nel caso volessimo conservare la portabilità di un programma, conviene usare malloc o new, ma in questo caso mi chiedo cosa si perda rispetto all'utilizzo della HeapAlloc, nel caso si perda qualcosa, ovvero quale significato abbia l'esistenza di quest'ultima.

Michele

4 Risposte

  • Re: Allocazione memoria dinamica: malloc vs new vs HeapAlloc

    Ma per semplici aree di memoria, c'è differenza tra new e malloc?
    malloc fa parte della standard library, è possibile utilizzarla anche C++ ed alloca memoria nell' heap. Alcune piattaforme utilizzano chiamate apposite per allocare sullo stack (es. malloca su glibc).
    new alloca nell'heap come malloc; esegue il casting e se riferito ad una classe chiama il costruttore. Entrambi possono soffrire di memory leaks.
    nel caso volessimo conservare la portabilità di un programma, conviene usare malloc o new
    new per C++ e malloc per C.
    ma in questo caso mi chiedo cosa si perda rispetto all'utilizzo della HeapAlloc
    Come detto prima alcune piattaforme hanno librerie proprie per allocare...
    Googlando sul tuo quesito risulterebbe che malloc chiami HeapAlloc internamente.

    Saluti,
    Max
  • Re: Allocazione memoria dinamica: malloc vs new vs HeapAlloc

    Aggiungendo: new e new [] sono rimpiazzabili (overloaded) ovvero si possono scrivere funzioni proprie che fanno la stessa cosa. HeapAlloc ovviamente essendo una funzione Win32 non è trasportabile se intendi riutilizzare il codice x linux o mac mentre new e malloc si.

    Maggiori informazioni su MSDN:
  • Re: Allocazione memoria dinamica: malloc vs new vs HeapAlloc

    Concludendo:
    La HeapAlloc è leggermente più articolata, ma è caratteristica di Windows, quindi con essa compromette la portabilità. Quindi direi che conviene sempre usare la più opportuna tra malloc() e new, in funzione del linguaggio in uso, a meno che non ci sia espressamente bisogno di qualche caratteristica specifica della HeapAlloc().

    Ora non ricordo più dove, ma da qualche parte ho letto che "malloc() è run-time dipendent, mentre new è compiler-dipendent".
    Come interpretereste voi queste due definizioni?
  • Re: Allocazione memoria dinamica: malloc vs new vs HeapAlloc

    Ora non ricordo più dove, ma da qualche parte ho letto che "malloc() è run-time dipendent, mentre new è compiler-dipendent". Come interpretereste voi queste due definizioni?
    La mia interpretazione è che entambi sono run-time dependent. Compiler-dependent è perchè ovviamente il secondo lo utilizzi solo in C++...

    Max
Devi accedere o registrarti per scrivere nel forum
4 risposte