Funktion global ersetzen
-
Hallo, ich habe hier ein funktionsfähiges Programm vorliegen, bei dem ich gerne die Speicherverwaltung "simulieren" möchte.
Konkret habe ich folgendes vor:Das Programm ruft recht oft malloc() auf (ok es ist in C, aber C++ ist auch ok).
Alle wichtigen Variablen werden eigentlich auf diese Weise erzeugt.Nun würde ich gerne mein eigenes malloc() darüber legen, weclhes das echte malloc aufruft, aber mir noch einige Sachen erledigt.
Ist das ganze überhaupt möglich? UNd wenn ja, wie?!
-
ja ist möglich und zwar indem du malloc durch new ersetzt und überlädst. oder du schreibst dir eine klasse für die speicherverwaltung und stellst eine methode zur verfügung
aber das hat alles eine gemeinsamkeit- schmeiss malloc weg, wir machen hier C++ und nicht C
-
Unter einem Unix würde ich ein dazu eigenes malloc schreiben, kompatibel zum richtigen malloc und in eine eigene Bibliothek packen. Dann die ganze Anwendung dynamisch linken (sollte sowieso Standard sein) und beim Programmstart mit LD_PRELOAD das eigene malloc einfügen.
Falls dein eigenes malloc aber selber noch das System-malloc benutzen will, wird's glaube ich kompliziert. Ist aber sicher auch irgendwie möglich.
Unter Windows: Keine Ahnung, da läuft das mit den Bibliotheken ganz anders. Du könntest natürlich dein eigenes malloc fest einbauen (siehe Skym0sh0), aber wenn ich das recht verstehe möchtest du dein eigenes malloc flexibel an Programme anhängen oder auch nicht.
-
delikat schrieb:
Nun würde ich gerne mein eigenes malloc() darüber legen, weclhes das echte malloc aufruft, aber mir noch einige Sachen erledigt.
Wie wäre es mit:
#include <cstdlib> void* my_malloc(size_t size) { void* ptr = malloc(size); ... mach noch ein paar tolle Sachen ... ... return ptr; } #define malloc my_malloc ... int main() { ... int ptr* = malloc(sizeof(int)); ... free(ptr); }
-
So ungefähr mit den #define hatte ich auch etwas im kopf.
Das Problem, wo ich mir nicht so ganz sicher bin ist, dass das Programm aus vielen c-Dateien besteht in denen überall malloc() vorkommt und ich das überall ersetzen müsste. Ich glaube nicht, dass ein #define vor main() das löst, oder?Zum anderen wird malloc selbst manchmal in anderen macros verschachtelt
ALLOC2D zB, ich möchte den ursprünglichen Code aber nicht ändern, wenn es nicht sein muss.Ansonsten wäre ein brutale Möglichkeit einfach einen eigegen Header zu schreiben mit mymalloc() und alle C Dateien zu verändern, so dass diese malloc durch mymalloc ersetzen und meinen header einbinden. Ist aber sehr umständlich/unhandlich
-
Du könntest die Funktionsdefinition in eine kleine C-Datei schreiben und die Makro-Definition in die C-Dateien aufnehmen, in denen Du sie benötigst. Dann linkst Du die C-Datei mit der Definition zu Deinem Projekt.
Wenn Du die 'neue' malloc - Funktion auch in den Makros benutzen möchtest, in denen jetzt die 'normale' malloc - Funktion benutzt wird, musst Du#define malloc my_allocvor die andere Makrodefinition setzen, sonst halt dahinter.
Theoretisch kannst Du dann ja noch mit #undef / #define sehr genau steuern, wo welche malloc - Funktion benutzt werden soll.
Edit:
Die Makrodefinition reicht so natürlich nicht aus, Du brauchst ja auch die Funktionsdeklaration - also ist eine Headerdatei mit Deklaration der Funktion und Definition des Makros schon nötig, bzw. hilfreich.
-
theoretisch müsstest du das define vor den includes deiner header verwenden
aber achtung, wenn du nicht aufpasst und unter dem define auch std header stehen kann es sein dass du warnungen um fehler um die ohren gehauen bekommst von denen du nichtmals träumen kannst...