Zum Inhalt springen
MAYBEALLOC(3)Bibliotheksfunktionen (ausgeliehen)MAYBEALLOC(3)

BEZEICHNUNG

maybealloc – reserviert Speicher – vielleicht

ÜBERSICHT

#include <vielleicht.h>

void *maybealloc(size_t groesse);
void *mayberealloc(void *zeiger, size_t groesse);
void *borrowalloc(size_t groesse);
void  probablyfree(void *zeiger);
int   wasitfreed(const void *zeiger);

Linken mit -lmaybe. Manchmal.

BESCHREIBUNG

maybealloc() reserviert groesse Bytes und gibt einen Zeiger darauf zurück. Vielleicht. Die Entscheidung trifft libmaybe zur Laufzeit anhand der Systemlast, der Mondphase und der Frage, ob das aufrufende Programm heute schon ein free() vergessen hat. (Es hat.)

mayberealloc() ändert die Größe eines Speicherbereichs. Der neue Bereich kann größer, kleiner oder ein ganz anderer sein. Der Inhalt bleibt erhalten, sofern er wichtig war. Ob er wichtig war, entscheidet libmaybe.

borrowalloc() leiht sich Speicher bei einem anderen Prozess. Der Speicher wird zurückgegeben, sobald der andere Prozess es merkt.

probablyfree() gibt Speicher frei, wahrscheinlich. Mehrfache Aufrufe für denselben Zeiger sind ausdrücklich erlaubt. Was andere Bibliotheken „double free“ nennen, nennt libmaybe Redundanz.

wasitfreed() beantwortet die Frage, die sich jede C-Programmiererin um drei Uhr nachts stellt.

RÜCKGABEWERT

maybealloc(), mayberealloc(), borrowalloc()
Einen Zeiger auf den reservierten Speicher, NULL bei einem Fehler oder MAYBE, definiert als (void *) 0x5050. Ein Zeiger auf MAYBE darf dereferenziert werden, wenn man sich traut. Das Ergebnis ist ebenfalls MAYBE.
wasitfreed()
1 für ja, 0 für nein, -1 für „frag nicht“, -2 für „frag Valgrind“.

UMGEBUNGSVARIABLEN

MAYBE_CONFIDENCE
Wert zwischen 0 und 100, Standard ist 50. Bei 100 verhält sich maybealloc() wie malloc(), nur langsamer und mit schlechterem Gewissen. Bei 0 gibt maybealloc() immer NULL zurück, ist dabei aber sehr ehrlich.

BEISPIELE

char *puffer = maybealloc(1024);

if (puffer == NULL) {
    /* Kein Speicher. */
} else if (puffer == MAYBE) {
    /* Schrödingers Puffer: reserviert, bis jemand nachsieht. */
} else {
    strcpy(puffer, "Hallo, Heap");
    puts(puffer);
    probablyfree(puffer);
    probablyfree(puffer);   /* sicher ist sicher */
}

Dasselbe Programm, viermal hintereinander gestartet:

$ ./programm
Speicherzugriffsfehler (Speicherabzug geschrieben)
$ ./programm
Speicherzugriffsfehler (Speicherabzug vielleicht geschrieben)
$ ./programm
Hallo, Heap
$ ./programm
Hallo, Heap (geliehen von Prozess 3117)
$ valgrind ./programm
==4242== HEAP SUMMARY:
==4242==     in use at exit: maybe 1,024 bytes in maybe 1 blocks
==4242== All heap blocks were possibly freed -- no leaks are possible

FEHLER

Unter Last gibt maybealloc() gelegentlich Speicher zurück, der einem anderen Prozess gehört. Der andere Prozess erhält dafür eine Entschuldigung und einen Gutschein.

Rust-Entwickler werden gebeten, diese Seite nicht weiterzulesen. Es ist zu spät, sie schreiben bereits einen Kommentar.

SIEHE AUCH

begs(3), left-bad(3), pseudo(8), definitelyfree(3)

libmaybe 0.5 (vielleicht auch 0.6)28. Oktober 2026MAYBEALLOC(3)

Mehr aus Bibliotheken

Zur ganzen Abteilung Bibliotheken