2010-11-29 4 views
5

In C++ können Sie can veranlassen, dass eine Funktion aufgerufen wird, wenn new fehlschlägt. Gibt es eine Möglichkeit, eine Funktion aufzurufen, die immer dann auftritt, wenn malloc fehlschlägt? Angenommen, malloc wird von Bibliotheken von Drittanbietern aufgerufen, die ich nicht ändern möchte.Gibt es ein Äquivalent von set_new_handler() für malloc() Fehler?

Ich glaube nicht, dass es eine portable Antwort gibt, also werde ich gerne plattformspezifische akzeptieren. Ich verwende Linux + uclibc auf einigen Plattformen und Linux + glibc auf anderen. Ich plane, zu verwenden, um die Menge des Speichers zu begrenzen, den malloc zurückgeben kann.

+0

Wir gehe davon aus, dass du dich übermalt hast. Recht? –

+0

Conrad: Ich hoffe es, aber ich besitze nicht das gesamte System, ich stelle nur eine App zur Verfügung. Ich wurde von den Leuten, die das System entworfen haben, eine gewisse Menge an RAM versprochen, und im Gegenzug muss ich versprechen, innerhalb dieser Grenze zu bleiben. (Dies ist ein eingebettetes Gerät ohne Swap, also werden die Leute mit dem Speicherbudget ziemlich ernst und stellen sicher, dass alles passt). – user9876

Antwort

11

malloc gibt NULL zurück, wenn es fehlschlägt. Sie sollten damit umgehen, und andere Ausfälle von CRT-Speicherfunktionen (realloc ist besonders leicht falsch).

Im allgemeinen Fall, ich denke, Sie müssten alle CRT-Nutzung von Speicher in Funktionen Ihrer eigenen Gestaltung umleiten, um bei Fehler umleiten.

Unter Windows können Sie in den CRT unter Verwendung Allocation Hook Functions einhaken, das eine Weise sein könnte, zu tun, was Sie wollen. Dies gibt Ihnen einen Haken zum Handhaben von CRT-Aufrufen über die Logik für onalloc, onrealloc, onfree, effektiv.

Ich mache keine Garantien, da ich ein Windows-Typ bin, aber es sieht aus wie malloc_hook on Linux bietet das gleiche wie Windows-Hook ermöglicht. Diese Methoden sollten es Ihnen ermöglichen, alle CRT-Speicheraufrufe zu erfassen, ohne Code in den Bibliotheken von Drittanbietern zu ändern, vorausgesetzt, sie verwenden alle die gleiche CRT zur Laufzeit - immer eine gute Idee, aber nicht garantiert unter Windows ...

+0

Ja, '__malloc_hook()' ist die korrekte Funktion unter Linux (zumindest glibc - ich weiß nichts über uclibc). – caf

+0

Von einer neueren Manpage: "Die Verwendung dieser Hook-Funktionen ist in Multithread-Programmen nicht sicher, und sie sind jetzt veraltet. Programmierer sollten stattdessen Aufrufe an die relevanten Funktionen durch Definieren und Exportieren von Funktionen wie" malloc "und" free "." http://www.kernel.org/doc/man-pages/online/pages/man3/malloc_hook.3.html – user9876

Verwandte Themen