/* * Simppeli koodinpätkä dynaamisesti varatun muistin laskemiseksi. * Yhteensopivuus: ANSI-C. * * Funktiot mem_malloc() ja mem_free() korvaavat standardifunktiot * malloc() ja free(). * * Tämä koodi ei ole tehokkainta mahdollista: malloc() ja free() * joutuvat jo pitämään kirjaa käytössä olevasta muistista, joten * se tulee tässä tehtyä toiseen kertaan. Koodi on kuitenkin * riittävä debuggaustarkoituksiin. Lisäksi ainakin uudemmat * Glibc-versiot tarjoavat omia funktioitaan käytetyn muistin * laskemiseen. Ne eivät kuitenkaan ole standardeja. */ #include #include void *mem_malloc(size_t size); void mem_free(void *ptr); size_t mem_usage(void); int main(void) { char *array[5]; int i; for (i = 0; i < 5; i++) { if ((array[i] = (char *) mem_malloc(20)) == NULL) exit(1); printf("%i\n", mem_usage()); } for (i = 0; i < 5; i++) { mem_free(array[i]); printf("%i\n", mem_usage()); } return 0; } /* Muuttuja käytetyn muistin laskemiseen. */ static size_t bytes = 0; /* * Toimii käyttäjän näkökulmasta kuten malloc(). * * Muistia varataan pyydetty määrä + yhden size_t-tyypin muuttujan * viemä tila. Varatun muistialueen alkuun tallennetaan muistialueen * koko ja käyttäjälle palautetaan pointteri lopun muistialueen alkuun. * Byte-laskuria kasvatetaan varattujen bytejen määrällä. */ void *mem_malloc(size_t size) { size_t *mem; if ((mem = (size_t *) malloc(size + sizeof(size_t))) == NULL) return NULL; bytes += size; *mem = size; return (void *) (mem + 1); } /* * Toimii käyttäjän näkökulmasta kuten free(). * * Funktio pienentää byte-laskuria oikealla luvulla ja vapauttaa * koko varatun muistialueen. */ void mem_free(void *ptr) { size_t *mem; mem = (size_t *) ptr - 1; bytes -= *mem; free(mem); } /* * Palauttaa varatun muistin määrän. */ size_t mem_usage(void) { return bytes; }