(gelöst)[C++] komische operator delete-Überladung
Verfasst: 24.10.2016, 11:14
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?
// 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?