linux-l: 2 Fragen: malloc und Uhr - Lösung

Mathias Born mborn at faphida.in-berlin.de
Fr Apr 30 10:37:17 CEST 1999


Christof Lutteroth wrote:

> Ersteinmal, wie kann ich die groesse eines mit malloc() allokierten
> Speicherblocks herausbekommen ?

Es gibt keine standardiserte Methode dafür, obwohl die Information
natürlich gespeichert werden *muß*.
In einem laufenden C-Projekt könnte man sich aber so behelfen:


void *coolMalloc(size_t size)
{
  char *p = (char*)malloc(size + sizeof(size_t));
  *((size_t*)p) = size;
  return (void*)(p + sizeof(size_t));
}

void coolFree(void *p)
{
  free( (void*)(((char*)p) - sizeof(size_t)) );
}

size_t mallocSize(void *p)
{
  return *((size_t*)(((char*)p) - sizeof(size_t)));
}

Dann schreibt mann eine Header-Datei, die man an passender Stelle
*überall* im Projekt einbindet.

void *coolMalloc(size_t size);
void coolFree(void *p);
size_t mallocSize(void *p);

#define malloc coolMalloc	// bitte nicht schreien
#define free coolFree

Man ist allerdings hier noch nicht fertig, da es auch noch andere
Funktionen (realloc(), calloc() etc.) gibt, die Speicher allozieren.
Die muß man auch noch "überschreiben", sonst klappt free() nicht mehr.

Das ganze ist ein übler Hack und höchst manipulativ, zudem ungetestet.
Also genau das richtige für einen harten C-Programmierer...

Mathias

PS: In C++ geht das alles noch viel eleganter!


-- 
>From "info gcc":
  `-trigraphs'
      Support ANSI C trigraphs.  You don't want to know about this
      brain-damage.  The `-ansi' option implies `-trigraphs'.



Mehr Informationen über die Mailingliste linux-l