Überladenes delete wird nicht aufgerufen
-
Hallo!
Ich habe global new und delete überladen:
void * operator new (size_t size, A& a, B& b, C& c, D& d); void operator delete (void* p, A& a, B& b, C& c, D& d); ... A a; B b; C c; D d; int* p = new(a,b,c,d) int; // ruft meinen operator new auf delete p; // das hier ruft NICHT meinen operator delete aufIch habe jetzt also einen operator new mit 4 Parametern. Wenn ich so einen operator new habe, dann muss ich doch einen entsprechenden operator delete überladen, der die selben Parameter kriegt, oder?
Wieso wird mein operator delete nicht aufgerufen?
-
Beim Aufruf von
delete p;weiß der Compiler nicht, ob und mit welchem placement new der entsprechende Speicherplatz angefordert wurde, deshalb verwendet er den Standard-operator delete für die Freigabe. Dein überladener Operator wird afaik von new aufgerufen, wenn nach der erfolgreichen Speicheranforderung etwas schiefgelaufen ist (z.B. eine Exception aus dem Klassen-Konstruktor).
-
Das is jetzt aber doof.
In meinem überladenen operator new mache ich einen Eintrag in eine std::list und im korrespondierenden operator delete() will ich den Eintrag wieder entfernen. Wie mache ich das dann, dass er wirklich meinen überladenen operator delete() (den mit void* und meinen 4 Parametern) aufruft?
-
Überlader2 schrieb:
Das is jetzt aber doof.
In meinem überladenen operator new mache ich einen Eintrag in eine std::list und im korrespondierenden operator delete() will ich den Eintrag wieder entfernen. Wie mache ich das dann, dass er wirklich meinen überladenen operator delete() (den mit void* und meinen 4 Parametern) aufruft?Das machst Du nicht.
Du schreibst einen überladenen operate delete und der schaut zuerst, ob der Speicher von deinem überladenen operator new kam.
-
Überlader2 schrieb:
Das is jetzt aber doof.
In meinem überladenen operator new mache ich einen Eintrag in eine std::list und im korrespondierenden operator delete() will ich den Eintrag wieder entfernen. Wie mache ich das dann, dass er wirklich meinen überladenen operator delete() (den mit void* und meinen 4 Parametern) aufruft?Also in etwa so?
void* operator new (size_t size, A& a, B& b, C& c, D& d) { void * p = getMemory(size); Entry entry(a,b,c,d); traceMap[p] = entry; return p; } void operator delete (void* p, A& a, B& b, C& c, D& d) { iterator it = _traceMap.find (p); if (it != traceMap.end ()) traceMap.erase (it); free (p); } void operator delete (void * p) { operator delete(a,b,c,d); }Dh. mein neuer standard operator delete (ohne Parameter) ruft operator delete() mit den 4 Parametern auf und wenn der Speicher per operator new(a,b,c,d) allokiert wurde, dann findet er einen Eintrag in der map und löscht ihn. Wenn nicht, gibt er nur Speicher frei. Ist das ok so?
Ist das auch in Ordnung, dass ich den default operator delete(void*p) überschrieben habe aber NICHT den dazugehörigen standard operator new(size_t)? (hab gelesen die soll man immer paarweise definieren)
-
Es dürfte Probleme geben, daß du keinen
operator newdefiniert hast (und ob dein operator delete mit dem Speicher umgehen kann, den der Default operator new bereitstellt, ist auch nicht sicher).
Außerdem: Welche Werte übergibt dein Default-delete eigentlich an den placement-delete?
-
CStoll schrieb:
Es dürfte Probleme geben, daß du keinen
operator newdefiniert hast (und ob dein operator delete mit dem Speicher umgehen kann, den der Default operator new bereitstellt, ist auch nicht sicher).
Außerdem: Welche Werte übergibt dein Default-delete eigentlich an den placement-delete?Hallo CStoll!
Koenntest du mir bitte kurz eine Mail schicken an struct at gmx dot net? Wuerde da gerne kurz was fragen.
-
Ueberlader2 schrieb:
Koenntest du mir bitte kurz eine Mail schicken an struct at gmx dot net? Wuerde da gerne kurz was fragen.
Nein, könnte ich nicht. Wenn du eine Frage hast, kannst du sie gerne hier stellen.