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,
NULLbei einem Fehler oderMAYBE, definiert als(void *) 0x5050. Ein Zeiger aufMAYBEdarf dereferenziert werden, wenn man sich traut. Das Ergebnis ist ebenfallsMAYBE. wasitfreed()1für ja,0für nein,-1für „frag nicht“,-2fü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
NULLzurü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 possibleFEHLER
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.