Diskussion:C++

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

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