Problem mit überladenen "delete"
- 
					
					
					
					
 Hi, 
 ich hab da ein etwas seltsames Problem, zumindestens meiner Logik nach.
 Also, ich habe eine Klasse "BaseParentWidget", die unter anderem ein Variable vom Typ std::string enthält. Nun habe ich in dieser Funktion den Operator delete überladen.void BaseParentWidget::operator delete(void *t) { cout << "Loesche Objekt " << ((BaseParentWidget *)t)->Name << " an Adresse " << t << endl; }Natürlich besitzt die Klasse auch einen Destruktor: BaseParentWidget::~BaseParentWidget() { cout << "Destruktor des Objektes " << this->Name << " aufgerufen" << endl; }Nun mein Problem: 
 Ich lege im Programm ein Objekt normal mit "new" an, und zum Schluss möchte ich dies mit dem Aufruf "delete" löschen. Ich bekomme folgende Ausgabe vom Programm:Destruktor des Objektes test aufgerufen 
 Loesche Objekt test- und ab hier massenhaft kryptische Zeichen. Caste ich im delete-Operator die Variable noch nach "string" (was sie ja eigentlich ist), beendet sich das Programm direkt mit einem Segfault nach (erfolgreichen) Aufruf des Destruktors. Verwende ich im delete Operator aber folgenden Code: void BaseParentWidget::operator delete(void *t) { cout << "Loesche Objekt " << ((BaseParentWidget *)t)->Name.data() << " an Adresse " << t << endl; }funktioniert alles Problemlos. Laut meinem Verständnis sollte ja das Objekt samt Variablen noch vollständig existieren, da mir das Überladen des delete-Operators ja die Möglichkeit gibt das Freigeben des Speichers selbst zu "organisieren", und in "meiner" delete-funktion wird nichts freigegeben. Oder sehe ich da was falsch und C++ gibt den Speicher schon frei bevor meine Funktion aufgerufen wird? 
 Hat da jemand ne Idee oder Antwort auf dieses seltsame Verhalten?
 Danke im Voraus
 the_easterbunnyedit: und warum wird hier "v o r r a u s" zensiert?  
 edit2: jetzt weis ich es ... 
 
- 
					
					
					
					
 Hithe_easterbunny! Definiere mal den überladenen delete-Operator als statisch. static void operator delete (void *t)Die Operatoren new und delete können für eine Klasse nur durch eine statische Memberfunktion der Klasse überladen werden. Auch wenn die Memberfunktion nicht explizit als statisch deklariert wird, wird sie durch den Compiler immer als solche angelegt. 
 
- 
					
					
					
					
 the_easterbunny schrieb: edit: und warum wird hier "v o r r a u s" zensiert?  Vll. weil es falsch ist. 
 Ein 'r' lang nämlich vollkommen.
 
- 
					
					
					
					
 hi, 
 @Stormrage: Danke, werd ich probieren!
 @hehejo: uuups peinlich peinlich ... 
 lg
 the_easterbunny
 
- 
					
					
					
					
 the_easterbunny schrieb: cout << "Loesche Objekt " << ((BaseParentWidget *)t)->Name << " an Adresse " << t << endl;das crasht. wir unterscheden erstmal die funktion namens operator delete. die gibt speicher frei. und den operator delete, der gibt objekte mit speicher frei. also delete pWidget; ist der aufruf des operators. der ist eingebaut und den kannste gar nicht ändern. 
 der macht innnendrin
 {
 pWidged->~~Widget();//den dtor aufrufen
 operator delete(pWidget);//den speicher freigeben;
 }
 das hat zur folge, daß das objekt auf jeden fall toto ist, wenn der operator delete deiner funktion delete den zeiger schickt. deine funktion darf den zeiger also nicht mehr dahingehend auswerten, daß du in gelöschte strings reinguckst.beschränke dich auf 
 cout << "Loesche Objekt an Adresse " << t << endl;
 und alles ist wieder gut.