Chiarimenti sullo heap

di il
33 risposte

Chiarimenti sullo heap

Salve a tutti
volevo sapere ma lo heap crea un suo segmento all'interno del programma oppure trova "le prime " locazioni libere esterne al programma ad alloca lo spazio richiesto?
xche vorrei capire se c'è e sia fattibile una routine che riconosca se una variabile è allocata nello heap o n meno.
ringrazio anticipatamente

33 Risposte

  • Re: Chiarimenti sullo heap

    Ci sono 3 aree di memoria principali:

    1)l'area in cui vengono allocate variabili statiche,
    2)lo stack, ATTENZIONE ne esiste uno per OGNI thread, e gestito dal SO/libreria di gestione dei thread
    3)lo heap, un'area di memoria assegnata su richiesta dal SO al processo,e gestito dalle routine malloc/calloc/free.

    poi ci sarebbero i

    3) thread local: stile memoria allocata sullo heap ma visibili solo all'interno di un specifico thread

    in linea di principio e' possibile capire a quale area di memoria appartiene, ma non e' semplice.

    piu' semplice e' quello di tenere traccia delle allocazioni nello heap: pero' bisogna farlo a mano.

    piu' in generale, non conviene dover risolvere tali tipi di problemi: sicuramente c'e' un modo piu' semplice di affrontare il problema
  • Re: Chiarimenti sullo heap

    Grazie per la risposta
    vediamo se ho capito bene:
    quindi in teoria se prendo l'indirizzo di inizio e fine dell'area delle variabili statiche e confrontando l'indirizzo della variabile da esaminare potrei dedurre che la variabile sia nello heap se il suo indirizzo e < inizio variabili statiche e > di fine variabili statiche.
    se ho capito bene però ci sarebbe un problema con le variabili globali che se ben ricordo stanno in un area diversa da quelle statiche.
  • Re: Chiarimenti sullo heap

    No, non puoi ragionare
    'se NON sta' qui, allora sta da quest'altra parte'

    puoi SOLO ragionare

    'se sta qui ok, altrimenti NON SO dove sta'
  • Re: Chiarimenti sullo heap

    Se pensi che è possibile allocare multipli heap (HeapAlloc) ti accorgi che è ina battaglia persa (e che sinceramente non so a cosa possa servire)
  • Re: Chiarimenti sullo heap

    Grazie per il chiarimento.
    quindi immagino che non ci sia un metodo per capire dove inizia e dove finisce lo heap.
    cosi da poter vedere se un indirizzo appartiene allo heap o meno.
  • Re: Chiarimenti sullo heap

    Esistono tanti heap potenzialmente, quindi..

    Ma sarebbe meglio che tu spiegassi veramente a chevti servirebbe per poterti dare un'alternativa
  • Re: Chiarimenti sullo heap

    Non voglio duplicare o creare heap multipli me ne basta uno!
    vorrei solamente riuscire a capire e fare una funzione alla quale io passo l'indirizzo di una variabile e lei mi restituisca 1 se la variabile stà nello heap altrimenti 0.
    la funzione servirebbe per capire se una variabile ha dei limiti ben precisi o teoricamente ha grandezza infinita e quindi adottare la giusta strategia operativa.
    e con una "piccola" modifica potrebbe anche servire per deallocare tutte le variabili presenti nello heap alla fine di una procedura.
  • Re: Chiarimenti sullo heap

    smalldragon ha scritto:


    Non voglio duplicare o creare heap multipli me ne basta uno!
    Che c'entra? Ti avvertivo che in un processo potresti avere più di un heap e quindi non sapere esattamente dove sta una variabile.
    Ovviamente se il processo è di un tuo programma, il problema non si pone, ma se generalizzi, per un qualsiasi programma, la cosa diventa importante.
    capire se una variabile ha dei limiti ben precisi o teoricamente ha grandezza infinita e quindi adottare la giusta strategia operativa.
    No, questa non l'ho capita. Grandezza "infinita" non esiste in nessun caso. Ma per cosa, è un mistero.
    potrebbe anche servire per deallocare tutte le variabili presenti nello heap alla fine di una procedura.
    L'heap non "ragiona" per variabile ma per blocco ... non ha senso.

    Comunque, solo per la cronaca, puoi "esplorare" la struttura dell'heap tramite la funzione HeapWalk ... forse ti può servire ...
  • Re: Chiarimenti sullo heap

    Parlando di c c++ segnalo che quasi sempre non esiste un'area specifica per le variabili statiche.
    esse sono 'mischiate' con il codice macchina. Questo accade perché è possibile definire variabili ovunque in mezzo alle procedure.

    Sul resto la risposta è: non si può dire in senso generale, in ogni caso.
    tra l'altro è impossibile deallocare le variabili dallo heap perché non sai quanto sono grandi.

    Stai tentando di re inventare il garage collector, ma arrivi in ritardo di circa 40 anni
  • Re: Chiarimenti sullo heap

    smalldragon ha scritto:


    ...
    e con una "piccola" modifica potrebbe anche servire per deallocare tutte le variabili presenti nello heap alla fine di una procedura.
    Non si e' capito molto quello che vorresti fare.

    COMUNQUE, se il problema e' deallocare IN BLOCCO tutta una serie di aree di memoria allocate nello heap all'interno di una funzione, il sistema esiste, ed e' un po' il garbage collector dei poveri.

    Si chiama "arena".

    Un'arena e' un'area di memoria in cui tu puoi solo ALLOCARE, ma NON deallocare.
    La deallocazione viene fatta rilasciando l'intera arena.

    L'implementazione e' abbastanza semplice: allochi blocchi di memoria di un certo numero di K (ad esempio 1 MB alla volta), ed allochi lo spazio che ti serve da questo blocco. Quando non c'e' piu' spazio nel blocco, ne allochi un'altro. Ovviamente devi tenere traccia dei blocchi che hai allocato.

    Quando devi rilasciare l'arena, rilasci tutti i blocchi.

    Ovviamente NON E' LA SOLUZIONE DI TUTTI I MALI: ad esempio NON PUOI chiamare i distruttori degli oggetti allocati nell'arena
    devi stare molto attento se vuoi usare LA STESSA ARENA con piu' thread. In generale conviene fare in modo che ogni thrad abbia la propria arena.

    In alternativa, esite "bohemgc" (http://www.hboehm.info/gc) un garbage collector conservativo per il C/C++.
  • Re: Chiarimenti sullo heap

    Puoi usare HeapSize:
    The HeapSize function returns the size, in bytes, of a memory block allocated from a heap by the HeapAlloc or HeapReAlloc function
    Se ritorna -1, allora non è nello heap. Ovviamente, se hai allocato dei heap privati, devi fare un loop per esaminarli tutti.
  • Re: Chiarimenti sullo heap

    Grazie per le risposte darò un occhiata hai link che mi avete postato e alle funzioni che mi avete consigliato.
    comunque il problema è semplicemente capire se una variabile stà in uno heap o meno.
    in maniera tale che se la sua dimensione è insufficiente e la variabile stà nello heap allora si possa creare una nuova variabile più grande copiare la vecchia e deallocare la vecchia variabile.
    ecco perchè parlavo di dimensioni teoricamente infinite.
    mentre se è una variabile globale o e una variabile statica e le sue dimensioni sono insufficienti terminare il programma con un codice di errore.
  • Re: Chiarimenti sullo heap

    Comunque tutte le dimensioni delle variabili sono conosciute.
  • Re: Chiarimenti sullo heap

    jj2007 ha scritto:


    Puoi usare HeapSize:
    The HeapSize function returns the size, in bytes, of a memory block allocated from a heap by the HeapAlloc or HeapReAlloc function
    Se ritorna -1, allora non è nello heap. Ovviamente, se hai allocato dei heap privati, devi fare un loop per esaminarli tutti.

    Non è così semplice. Così gestisci un "blocco" allocato in una heap ma non una singola "variabile" attraverso il suo indirizzo.
Devi accedere o registrarti per scrivere nel forum
33 risposte