Ich wundere mich gerade darüber, dass mich Visual C++ irgendwann mal nötigte, diesen Operator zu schreiben:
// Visual C++ 2015 seems to pull in this operator for placement “new”.
void operator delete(void *, size_t) {
}
Wie der Kommentar sagt, musste ich den als Reaktion auf Placement new einbauen, weil ich sonst ein nichtaufgelöstes externes Symbol hatte.
Okay. Nun suche ich ein fieses Speicherleck in meinem Programm, und natürlich lässt es sich auf diesen Operator zurückführen. Wenn ich darin nicht explizit mein free()-Äquivalent aufrufe, habe ich Leaks ohne Ende. (Die haben nichts mit Placement new zu tun; das wird an den entsprechenden Stellen garnicht benutzt.)
Warum?
Ich dachte der Signatur nach, es wäre ein No-op, das nur als Reaktion auf gescheitertes Placement new aufgerufen wird. Der Debugger (jedenfalls so weit ich durchgekommen bin, geht nur über Disassembly) sagt, dass es für jedes delete angesprungen wird und dass der normale operator delete(void *) nicht alles abkriegt. Ich bekomme auch keine Heap-Fehler, wenn ich dort Speicher freigebe; im Gegenteil – die Leaks verschwinden.
Bin ich da in irgendeine dunkle Klausel des Standards getappt?
(gelöst)[C++] komische operator delete-Überladung
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
(gelöst)[C++] komische operator delete-Überladung
Zuletzt geändert von Krishty am 24.10.2016, 11:45, insgesamt 1-mal geändert.
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: [C++] komische operator delete-Überladung
Das ist kein placement delete (placement delete hätte zwei void* parameter; placement new/delete darfst du gar nicht selbst definieren, das wäre iirc ill-formed oder UB). In C++14 wurden sized deallocation functions eingeführt... ;)
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [C++] komische operator delete-Überladung
Ja; Visual C++’ Implementierung erzeugt aber zwei Befehle zu viel und CRT/STL nutze ich eh nicht und Sprach-Features an einen STL-Header (<new>) zu binden ist Idiotie usw. Ich mach’s einfach.dot hat geschrieben:placement new/delete darfst du gar nicht selbst definieren, das wäre iirc ill-formed oder UB).
FFFFFFFFFFUUUUUUUUUUUUUUUUUUUUUCKdot hat geschrieben:In C++14 wurden sized deallocation functions eingeführt... ;)
Dann hat Visual C++ mich auch nicht wegen Placement new zu dieser Überladung gezwungen, sondern der C++14-Umstieg fiel zeitlich mit meinen Änderungen zusammen.
Danke, danke, danke!
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: (gelöst)[C++] komische operator delete-Überladung
always glad to help ^^
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: (gelöst)[C++] komische operator delete-Überladung
Visual C++ muss das letztens mit einem Update eingeführt haben, oder? Ich habe hier Leistungsdiagramme meines Programms und der Speicherverbrauch stieg erst vor einigen Monaten an, nicht schon beim Erscheinen von Visual Studio 2015. Fies. Jetzt ist er jedenfalls wieder auf Ausgangswerten.
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: (gelöst)[C++] komische operator delete-Überladung
Puh, kann ich leider grad nix finden wann das eingeführt wurde. Würd mich aber doch wundern, da die potentially breaking changes normal nur mit major Versions machen...Krishty hat geschrieben:Visual C++ muss das letztens mit einem Update eingeführt haben, oder?
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: (gelöst)[C++] komische operator delete-Überladung
War nur Breaking, wenn man nicht die CRT nutzt. Sonst hat die ja den passenden Operator mitgeliefert, und die Placement-Operatoren haben ja eine andere Signatur.
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: (gelöst)[C++] komische operator delete-Überladung
True dat. MSDN gibt jedenfalls leider nur darüber Auskunft, dass es ab VS 2015 supported ist, nicht aber ob erst mit einem konkreten Update...