operator new und Konstruktor
-
Hi!
Wenn ich das habe:
void* operator new(size_t s) { return (void*)malloc(s); }und ich dann sowa mache:
Obj* myobj = new Obj(1,2,3);Wird dann auch der Konstruktor von Obj aufgerufen? Steht ja nichts im operator new dazu drin, wüsste aber auch nich, wie as gehen sollte, da der Typ ja in operator new nicht bekannt ist. wir der konstruktor also automatisch aufgerufen?
Gruß, Maxi
-
Du überschreibst damit lediglich die Funktion operator new. Nicht aber den Operator selbst. Die Funktion operator new wird von Operator new aufgerufen um Speicher für das Objekt zu bekommen. Außerdem ruft der Operator new u.A. auch den Konstruktur auf.
Also: Jep, der Konstruktor wird aufgerufen und du kannst nichts, rein garnichts daran ändern!
Es sei denn du rufst direkt die Funktion operator new auf.
-
Der Cast vor malloc sollte übrigens weg. Die Funktion gibt sowieso void* zurück.
-
hm.. soweit klar. Noch ne Frage dazu:
Ich habe eine lib-datei, die statisch zu meinem Prog gelinkt wird. Wenn in dieser Lib dann ein new aufgerufen wird, wird dann mein operator new aufgerufen oder der standrad-operator?
Ich meine der standard-operator, is ja nix virtuell doer so so dabei. Aber wie könnte man es erreichen ,dass die lib auch den neuen op benutzt?
-
hm...
weiß keiner? oder versteht ihr meihne Frage nicht?
-
Maxi schrieb:
hm.. soweit klar. Noch ne Frage dazu:
Ich habe eine lib-datei, die statisch zu meinem Prog gelinkt wird. Wenn in dieser Lib dann ein new aufgerufen wird, wird dann mein operator new aufgerufen oder der standrad-operator?Dein definierter Operator, falls in deiner Lib die Klassen sich keinen eigenen op-new definiert haben ...
// in der Lib class MyClass { private: int a; public: // Klasse hat einen eigenen op-new void* operator new(size_t size) // (1) { return malloc(s); //return ::operator new(size); << deiner würde aufgerufen } void func() { int *t = new int; } // deiner wird aufgerufen }; //in zB main von dir MyClass *obj = new MyClass; // (1) wird aufgerufen obj->func();Also am besten vorsichtig sein wenn man den globalen ( überall und in jeder Datei) op-new new schreibt.
Edit: Du kannst es ja auch mal ganz einfach testen. Haue in dein global-op-new eine Ausgabe rein und rufe irgendwas aus deiner Lib auf, wo du davon ausgehen kannst das irgendwas dann new braucht ....
-
oh das trifft sich ja gut

In meinem fall ist das glaub ich eine gute möglichkeit. Ich habe damit alle speicherallokationen von meinen dlls die per plugin eingebunden werden auf die exe umgelenkt und alle deletes auch. Dadurch gibts keine problem mit dem löschen eines bereiches in einer dll der der speicher gar nich gehört.
-
Nein, mit einer DLL funktioniert das NICHT.
Mit einer statischen LIB ja, mit einer DLL nicht.
Dass eine DLL dabei auch eine ".lib" hat die man dazulinkt ist schon klar, trotzdem führt das nicht dazu dass hier der Code in der DLL statisch gelinkt würde. In diesem Fall ist das zugegebenermassen etwas verwirrend.Du solltest auf jeden Fall wenn du eine DLL meinst auch immer schreiben dass es um eine DLL geht, bzw. um das .lib File einer DLL - sonst können solche Misverständnisse passieren.
BTW: das hat mit Standard C++ nixmehr zu tun, DLLs sind z.B. unter Windows ganz anders implementiert als unter Linux (wo sie strenggenommen nichtmal DLLs heissen, und eben einiges ganz anders läuft). Die Frage gehört also eher ins Visual C++ Forum.
-
na ne, hast mich ein bisschen falsch verstanden

also es is so:
// Image.lib // Diese Lib wird zu jedem Plugin gelinkt. class cImage() { ... m_Data = new char[100*100]; }; // plugin1.dll // ... void* operator new(size_t s) { return AllocFunctionInExe(s); }; // Über funktionszeiger m_Image = new cImage; // operator new wird von cImage in der lib aufgerufen, dadurch der in der dll definierte //.exe void* AllocFuncInExe(size_t s) { return mallo(s); }hoff das is klarer so

Ja, das hat wirklich nichts mehr mit std-c++ zu tun.
Aber die anfängliche Frage schno, und weil die hetzt dazu passte hab ich sie einfach mal angefügt
-
Aaaaaaah, Bingo.
Ja, OK, das hab ich falsch verstanden. Ja, so geht das