windows - C + + Find ud af dynamisk hukommelse i brug

Indlæg af Hanne Mølgaard Plasc

Problem



Hej og tak på forhånd for din hjælp.


Først og fremmest er dette til lektier, men jeg har gjort næsten alt, hvad jeg har brug for. Vi blev bedt om at gennemføre en tilknyttet listeklasse, tilføje nogle til og slette den og beregne den hukommelsesforbrug.


Jeg har listerne gjort, og tilføjelsen og sletningen (fra en tekstfil). Alt dette er gjort. Jeg er dog fast ved at beregne hukommelsesforbruget.


Jeg har været på udkig efter en nem måde at gøre dette på, og jeg har ikke fundet noget. Hvad jeg faktisk har brug for er en metode, der vil returnere mængden af ​​dynamisk hukommelse i brug. Det er alt. Jeg har fundet flere værktøjer til at finde hukommelseslekkage, men jeg tror, ​​at de er lige over toppen, for hvad jeg har brug for.


Jeg fandt også en metode til at finde mængden af ​​hukommelse, en proces bruger, men jeg har heller ikke brug for det. Jeg skal bare finde ud af den samlede mængde hukommelse, der bruges, som i Task Manager.


Jeg bruger Virtual Studio på Windows 7. Tak for din hjælp !!


EDIT


Her er netop hvad læreren bad os om at gøre (oversat fra spansk):


'Hver gang indlæsningsoperationen (fra tekstfilen, ikke-relateret) er realiseret, skal programmet vise, hvor meget hukommelse der er tilgængelig i Heap (hukommelse til tildeling), og hvor meget der er tilgængeligt før indlæsningen af ​​filen.'

Bedste reference


Hvad med at du sporer din hukommelse manuelt? I hver konstruktør:


global\_size += sizeof(*this);


og i enhver destructor:


global\_size -= sizeof(*this);


forbehold:



  • Hvis du bruger arv, skal du sørge for ikke at tælle objektstørrelse flere gange.

  • Kun strukturer, du ændrer med ovenstående kode, tælles med, ikke andre strukturer som strenge eller arrayer (selvom arrayet indeholder dine strukturinstanser, vil de stadig tælles).



På ethvert tidspunkt vil global\_size have mængden af ​​hukommelse, der tages af de strukturer, du sporer.


Alternativt kan du erstatte de globale nye/slette operatører:


void* operator new(std::size\_t) throw (std::bad\_alloc);
void* operator new[](std::size\_t) throw (std::bad\_alloc);
void* operator new(std::size\_t, const std::nothrow\_t&) throw();
void* operator new[](std::size\_t, const std::nothrow\_t&) throw();
void operator delete(void*) throw();
void operator delete[](void*) throw();
void operator delete(void*, const std::nothrow\_t&) throw();
void operator delete[](void*, const std::nothrow\_t&) throw();


Og gør hukommelsestællingens magi i dem. Se også Hvordan kalder jeg den oprindelige 'operator ny', hvis jeg har overbelastet den?


Se også Sådan får du hukommelsesbrug ved kørselstid i c ++?

Andre referencer 1


Jeg fandt GetProcessMemoryInfo funktion (Windows)


http://msdn.microsoft.com/en-us/library/windows/desktop/ms683219(v=vs.85).aspx[10]


Brug \_getpid (), når det spørger dig om proces-id


http://msdn.microsoft.com/en-us/library/t2y34y40.aspx[11]


Jeg bruger ikke Windows selv, men ser ud til at det skal fungere.


Under Linux kan du spørge/proc/PID/statm

Andre referencer 2


Du er virkelig overthinking dette. Du blev bedt om at finde ud af den hukommelse, som din liste bruger. Det er summen af ​​alle noderne i din liste * størrelsen af ​​hvert node og dets indhold.

Andre referencer 3


Du kan overbelaste den globale operatør ny og slette og holde styr på det.

Andre referencer 4


Hvis du tager lærerens spørgsmål så bogstaveligt som muligt, kan du gøre det ved hjælp af HeapWalk-funktionen. Dette giver dig mulighed for at beregne både frit og brugt rum i den høje efter dit valg (du vil sandsynligvis have standardhurtigheden, se GetProcessHeap). [[[12] [13]


Da bunken ekspanderer efter behov (inden for rammerne af procesens virtuelle adresserum og tilgængelig virtuel hukommelse), er disse oplysninger normalt ikke særlig nyttige i praktiske termer. Men det kan tjene dine behov.

Andre referencer 5


Nå, løsningen på dit problem afhænger virkelig af, hvad du præcist bedes gøre. Der er stor forskel på en samlet hukommelsesforbrug af applikationen og en hukommelse, der bruges af en linket liste. Hvis du har brug for at vide, hvor meget hukommelse din tilknyttede liste bruger, skal du multiplicere et antal noder ved størrelsen af ​​enkeltnoden. Her er et simpelt eksempel (i C skal du justere det lidt for at gøre det C + + kompatibelt):


#include <stdio.h>
#include <stdlib.h>

struct list\_node {
    int data;
    /* ... other stuff ... */
    struct list\_node *next;
};

int main(void)
{
    int i;
    struct list\_node *list;
    struct list\_node *node;

    /* Create a single linked list with 5 elements */
    node = list = malloc(sizeof(struct list\_node));
    if (!node)
        abort(); /* Not enough memory */
    node->data = 0;

    for (i = 1; i < 5; ++i) {
        node->next = malloc(sizeof(struct list\_node));
        if (!node->next)
            abort(); /* Out of memory */
        node = node->next;
        node->data = i;
        node->next = NULL;
    }

    /* Print a list, count a number of nodes, and estimated memory usage. */
    i = 0;
    for (node = list; node != NULL; node = node->next) {
        ++i;
        printf("Node \%d
", node->data);
    }

    printf("\%d nodes use \%ld bytes of memory (\%ld per node).
",
           i, i * sizeof(struct list\_node), sizeof(struct list\_node));

    /* TODO: Free resources... */
    return 0;
}


I dette eksempel blev 5 noder oprettet for at danne en linket liste. Så den samlede mængde hukommelse, der er nødvendigt for listen, er 5 * sizeof(struct list\_node).


Selvfølgelig tildeler du en ekstra plads, når du tildeler hukommelse med malloc() -funktionen. For eksempel skal den gemme en information et sted for at vide, hvor mange byte der blev tildelt for en given peger for at frigøre den, det tager også sig af justering og kan tildele mere plads end nødvendigt, så næste gang du ringer malloc() hukommelsen vil allerede være der.


Så hvis du virkelig vil vide alle disse detaljer, så skal du bruge operativsystemspecifik grænseflade til at bestemme, hvor meget virtuel hukommelse din applikation bruger. Du har specielt brug for to tal - hukommelsesbrug før og efter tilknytning af oprettelse af listen. Desværre er der ingen standard API for det. Men her er en god Q &A, der kan hjælpe dig med at komme rundt på din platform og løse dette - Hvordan bestemmer du CPU og hukommelsesforbrug indefra en proces?


Det er mest sandsynligt, at din lærer ønskede at du skulle gøre det enkle. Men hvis du gør begge dele - det vil kun være et plus for dig.


Held og lykke!