Chiarimenti sullo heap

di il
33 risposte

33 Risposte - Pagina 2

  • Re: Chiarimenti sullo heap

    smalldragon ha scritto:


    comunque il problema è semplicemente capire se una variabile stà in uno heap o meno.
    E mica è un problema "semplice".
    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.
    Non puoi deallocare la singola variabile, se non è stata allocata singolarmente.

    Comunque, mi sembra una questione che ha veramente poco senso.
    ecco perchè parlavo di dimensioni teoricamente infinite.
    Non esiste, né teoricamente né praticamente.
    mentre se è una variabile globale o e una variabile statica e le sue dimensioni sono insufficienti terminare il programma con un codice di errore.
    Puoi sempre allocare nell'heap, copiare il valore e continuare.

    Ma non ha senso se il programma lo stai scrivendo tu! Sai esattamente dove stanno le variabili !

    Continuo a NON CAPIRE dove tu voglia arrivare, quale tipo di programma tu voglia scrivere. Mi sa che comunque sei molto fuori strada.
  • Re: Chiarimenti sullo heap

    Ma la heapsize non restituisce solo la grandezza dello heap?
    infatti
    il problema in questo caso nascerebbe se nello heap esistono più variabili ed io ne voglio controllare solo una.
  • Re: Chiarimenti sullo heap

    Tutte le variabili che uso sono allocate singolarmente per poterle poi deallocare quando non servono più.
    quando si lavora su diversi moduli capita spesso,almeno a me, di dimenticarsi dove si è definita una variabile!
    ed un sistema per capirlo/ricordarselo non guasta
    allora con heapsize ho la dimensione dello heap
    adesso c'è un sistema per prendere l'indirizzo di inizio dello heap?
    poi lo heap usa una tabella o è sequenziale?
  • Re: Chiarimenti sullo heap

    Se allochi ogni variabile crei un disastroso effetto di frammentazione che porta velocemente al blocco dei processi a 32 bit. Diversa la questione per i 64 bit ma non è neanche sensato.
  • Re: Chiarimenti sullo heap

    Non alloco ogni singola variabile del programma perchè se cosi fosse non avrei questo problema!
    ma alloco solo quelle variabili che devono avere una dimensione variabile.
    tipo vettori e strutture.
    ma non vado ad allocare grandi pezzi di memoria perchè poi li dovrei suddividere, riorganizzandoli, creando confusione e spreco di memoria.
  • Re: Chiarimenti sullo heap

    oregon ha scritto:


    jj2007 ha scritto:


    Puoi usare HeapSize
    Non è così semplice. Così gestisci un "blocco" allocato in una heap ma non una singola "variabile" attraverso il suo indirizzo.
    Di solito, la "singola variabile" è un pointer a heapmemory - stringa, array, vettore. Quindi HeapSize è esattamente quello che serve.
  • Re: Chiarimenti sullo heap

    jj2007 ha scritto:


    oregon ha scritto:


    jj2007 ha scritto:


    Puoi usare HeapSize
    Non è così semplice. Così gestisci un "blocco" allocato in una heap ma non una singola "variabile" attraverso il suo indirizzo.
    Di solito, la "singola variabile" è un pointer a heapmemory - stringa, array, vettore. Quindi HeapSize è esattamente quello che serve.
    Lui passa l'indirizzo di una variabile generica. Se sapesse che è allocata dal programma, non avrebbe senso controllarla. Se non sa nulla della variabile, potrebbe succedere, ad esempio, che la variabile è allocata sullo stack. Cosa succederebbe con

    int a = 0;
    int x = HeapSize(GetProcessHeap(), 0, &a);

    ?
  • Re: Chiarimenti sullo heap

    oregon ha scritto:


    Cosa succederebbe con

    int a = 0;
    int x = HeapSize(GetProcessHeap(), 0, &a);

    ?
    Che ne so, forse "Invalid address specified to RtlSizeHeap( 00660000, 0018FF80 )"? Un caso per SEH...? In realtà ritorna zero e basta, se non hai attaccato un debugger.
  • Re: Chiarimenti sullo heap

    Burdel avete idee quantomeno confuse.
    rammento che i sistemi operativi (praticamente tutti) allocano memoria fisica a blocchi di 4k (pagine) e quindi La situazione è 'leggermente' più complessa.
    comunque detto questo: continua a non essere considerato il 'piccolo' problema di dover tener traccia di quanto allocato
    Insomma l'acqua calda volevo dire il garage collector o uno dei suoi cugini
    Se non sbaglio inventato nel 1960 circa cioè circa 60 anni fa
  • Re: Chiarimenti sullo heap

    +m2+ ha scritto:


    Burdel avete idee quantomeno confuse.
    ...
    Insomma l'acqua calda volevo dire il garage collector o uno dei suoi cugini
    Se non sbaglio inventato nel 1960 circa cioè circa 60 anni fa
    smalldragon ha una semplicissima domanda, e HeapSize puo' dare la risposta.

    smalldragon ha scritto:


    vorrei capire se c'è e sia fattibile una routine che riconosca se una variabile è allocata nello heap o n meno.
  • Re: Chiarimenti sullo heap

    @jj2007: la domanda e' semplice, ma la tua risposta E' SBAGLIATA!
    Leggiti la documentazione di HeapSize!
    E comunque la risposta è complicata!
  • Re: Chiarimenti sullo heap

    Scusatemi
    vediamo di capirci qualcosa e trarre la risposta.

    quando faccio
    
              struct attributo
                    {
                      int attribbuto;
                      char *valore;
                    };
    numero = new (std::nothrow) attributo;
    
    viene assegnato un indirizzo nello heap alla variabile numero tramite la funzione malloc
    giusto?
    adesso visto che malloc per "accontentare" la mia richiesta crea un area ben specifica.
    vorrei sapere come faccio a calcolarmi o prendere l'indirizzo iniziale e finale di questa area
    e se è possibile anche la sua struttura.
    immagino che la struttura possa essere una di queste 2.
    1) indirizzo elemento allocato = memoria heap diretta
    indirizzo secondo elemento allocato = memoria heap diretta del primo elemento +sua dimensione +1
    2) indirizzo elemento allocato = i° elemento di tabella heap
    secondo elemento allocato = II elemento di tabella heap
    con la tabella heap fatta nel seguente modo
    [0,0]=locazione di memoria allocata
    [0,1..]=locazioni di memoria allocata (qualora non si trovassero abbastanza byte consecutivi per soddisfare la richiesta)
    [0,x]=byte memoria allocata

    spero che adesso la questione sia un pò più chiara
  • Re: Chiarimenti sullo heap

    Da dove hai tirato fuori la sintassi
    
    new (std::nothrow) T
    
    ???

    @smalldragon: te lo stiamo dicendo in tutte le salse: NON LO PUOI SAPERE,

    oppure, se vuoi,
    PER SAPERLO DEVI andare ad analizzare l'IMPLEMENTAZIONE della malloc, della new, e della gestione a basso livello dell'allocatore di memoria della libreria C/C++

    Cioe' devi andare nei DETTAGLI IMPLEMENTATIVI, che NON SONO BANALI, perche' l'allocatore usa delle strategie molto sottili e non necessariamente descritte da qualche parte.
  • Re: Chiarimenti sullo heap

    migliorabile ha scritto:


    @jj2007: la domanda e' semplice, ma la tua risposta E' SBAGLIATA!
    Leggiti la documentazione di HeapSize!
    E comunque la risposta è complicata!
    Carissimo, ho letto la documentazione di HeapSize. OP vuol sapere se un pointer (=un indirizzo) si trova nel heap.
    #include <stdio.h>
    #include <conio.h>	// _getch() mi piace da morire ;-)
    #include <windows.h>
    
    int isHeap(void* pVar) {
      if (IsBadReadPtr(pVar, 1))
    	return -999;
      else
    	SetLastError(0);
    	int result=HeapSize(GetProcessHeap(), 0, pVar);
    	int lasterr=GetLastError();
    	if (lasterr)
    		return -lasterr;
    	else
    		return result;
    }
    
    int vGlobal=0;	// variabile globale
    
    int main(void) {
      HANDLE vHeap = HeapAlloc(GetProcessHeap(), 0, 100);
      void* vMalloc=malloc(123);	// grazie per l'ispirazione a migliorabile ;-)
      int vStack=0;	// simple stack variable
      printf("IsHeap vHeap=   \t%i\n", isHeap(vHeap));
      printf("IsHeap vStack=   \t%i\n", isHeap(&vStack));
      printf("IsHeap vGlobal=   \t%i\n", isHeap(&vGlobal));
      printf("IsHeap vMalloc=   \t%i\n", isHeap(&vMalloc));
      vHeap=(HANDLE)0x12345678; // i soliti casini ;-)
      printf("IsHeap 0x12345678=\t%i\n", isHeap(vHeap));
      _getch();
    }
    
    Funziona bene con Gcc, G++, Pelles C, mentre Visual C fa degli scherzi.

    Risultati:
    IsHeap vHeap=           100
    IsHeap vStack=          -87
    IsHeap vGlobal=         -87
    IsHeap vMalloc=         -87
    IsHeap 0x12345678=      -999
    Ovviamente, -87 significa "invalid parameter".
  • Re: Chiarimenti sullo heap

    Okey
    sapreste indicarmi un sito dove posso prendere il sorgente della malloc e della new cosi me li posso studiare?
    e magari trovare la soluzione.
Devi accedere o registrarti per scrivere nel forum
33 risposte