Diskussion:C++
Die genannten operator-Überladungen sind so nicht vollständig:
1. Es sollen die operatoren ::new ::delete etc. überladen werden. Das muss dann da aber auch stehen.
2. Die Semantik wird geändert. ::new, ::new[], ::delete und ::delete[] rufen die Konstruktoren, bzw. die Destruktoren der Objekte auf. Das ist hier nicht der Fall. Darauf sollte hingewiesen werden.
Hallo Namenloser!
Zu 2.: In wie fern wird deiner Meinung nach die Semantik verändert? Und wie kommst du darauf, dass die Konstruktoren und Destruktoren nicht aufgerufen werden?
Betrachte z.B. einmal dieses Beispiel:
extern "C" { #include <stdio.h> } class MyClass { private: int *c; public: void print() { printf("%d\n", *c); } MyClass(int x) { c = new int; *c = x; } ~MyClass() { delete c; printf("deleted c!\n"); } }; int main() { MyClass *mc = new MyClass(42); mc->print(); delete mc; return 0; }
Ausgabe ist:
42 deleted c!
new und delete funktionieren also völlig normal. Und: Nein, es wurde nicht das normale new/delete verwendet. Das sieht man, wenn man newdelete.cpp nicht mitkompiliert:
/tmp/ccYHDV5B.o: In function `main': test.cpp:(.text+0xf): undefined reference to `operator new(unsigned long)' test.cpp:(.text+0x4d): undefined reference to `operator delete(void*)' /tmp/ccYHDV5B.o: In function `MyClass::~MyClass()': test.cpp:(.gnu.linkonce.t._ZN7MyClassD1Ev+0x14): undefined reference to `operator delete(void*)' /tmp/ccYHDV5B.o: In function `MyClass::MyClass(int)': test.cpp:(.gnu.linkonce.t._ZN7MyClassC1Ei+0x1a): undefined reference to `operator new(unsigned long)' collect2: ld returned 1 exit status