Ich kann einige Probleme nicht verstehen, wenn ich neu lerne/Überladung lösche. Fragen:Überladungsoperator new(), warum Konstruktor zweimal aufgerufen wird?
- Warum neue vor dem Konstruktor, Destruktor vor dem Löschen aufgerufen wird?
- Warum wird Konstruktor zweimal aufgerufen, wenn :: new?
ich den Code hier angefügt haben:
#include<iostream>
using namespace std;
class MyClass
{
public:
MyClass() {
cout << "My Class is Constructed !" << endl;
}
~MyClass() { cout << "My Class is Deleted ! " << endl; }
static void *operator new(size_t Size)
{
cout << "new call" << endl;
MyClass *p = ::new MyClass;
return p;
}
static void operator delete(void *p)
{
cout << "delete call" << endl;
::delete p;
}
};
int main()
{
MyClass *p = new MyClass;
delete p;
cin.get();
return 0;
}
output:
new call
My Class is Constructed !
My Class is Constructed !
My Class is Deleted !
delete call
Sie sollten nicht ':: new MyClass' innerhalb' MyClass :: operator new' machen. Der Zweck dieser Funktion ist die Zuweisung von Speicher ohne Aufruf von Konstruktoren, aber Sie machen einen Konstruktoraufruf (deshalb sehen Sie 2 Konstruktoraufrufe - entsprechend Ihren beiden Verwendungen des 'neuen' Ausdrucks). –
Für Ihre Frage 1 muss natürlich Speicherplatz eingeholt werden, bevor ein Objekt darin konstruiert werden kann; und das Objekt muss zerstört werden, bevor der Speicher freigegeben wird –
@ M.M: Antwort Abschnitt ist unten. –