P
eine Frage bitte schrieb:
Ja, aber den Aufruf des Konstruktors wollte ich doch unbedingt vermeiden, weil ich vorhatte, mein Array von Medien-Objekten dynamisch zu verwalten. Und dazu musste ich dann neuen Speicher anlegen und es wäre wirklich nicht so toll, wenn dabei stets der Konstruktor aufpoppt.
Den Aufruf des Konstruktors vermeidest du indem du einfach operator new[] selber aufrufst. Schnellerklärung zum Thema: C++ unterscheidet zwischen der Funktion operator new[] und dem Operator new . Das, was wir normalerweise im Quellcode schreiben, ist der Operator new . Der Compiler macht daraus einen Aufruf des operator new[] , gefolgt von entsprechend vielen Konstruktoraufrufen für die ganzen Elemente des Arrays. Ähnliches gilt für den Operator delete : Hier wird erst der Destruktor aufgerufen, danach dann operator delete , der nurnoch den Speicher freigibt.
Dein Versuch, operator new[] zu überladen wäre also wirkungslos, die konstruktoren würden immernoch aufgerufen wenn du den Aufruf nicht änderst.
Unskilled hatte eigentlich schon den richtigen Hinweis geliefert:
X* blankerSpeicher = operator new[](n*sizeof(X)); //Speicher für n Xe
for (int i = 0; i < n; ++i)
new (blankerSpeicher + i) X(); //placement new
//freigeben:
//delete[] blankerSpeicher; //ruft alle Destruktoren auf und dann operator delete[]
for (int i = n-1; i >= 0; --i)
blankerSpeicher[i].~X(); //manueller Dtoraufruf
operator delete[] (blankerSpeicher);
Der Fehler bei deinem überladenen operator new war übrigens, dass du ihn nicht static deklariert hast. Wenn man sichs genau überlegt kann er garnicht anders als static sein, schließlich gibts kein Objekt, das ihn aufruft um Speicher für ein anderes Objekt zu beschaffen.