Seite 1 von 1

(gelöst)[C++] komische operator delete-Überladung

Verfasst: 24.10.2016, 11:14
von Krishty
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?

Re: [C++] komische operator delete-Überladung

Verfasst: 24.10.2016, 11:30
von dot
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... ;)

Re: [C++] komische operator delete-Überladung

Verfasst: 24.10.2016, 11:44
von Krishty
dot hat geschrieben:placement new/delete darfst du gar nicht selbst definieren, das wäre iirc ill-formed oder UB).
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:In C++14 wurden sized deallocation functions eingeführt... ;)
FFFFFFFFFFUUUUUUUUUUUUUUUUUUUUUCK

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!

Re: (gelöst)[C++] komische operator delete-Überladung

Verfasst: 24.10.2016, 11:47
von dot
always glad to help ^^

Re: (gelöst)[C++] komische operator delete-Überladung

Verfasst: 24.10.2016, 11:48
von Krishty
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.

Re: (gelöst)[C++] komische operator delete-Überladung

Verfasst: 24.10.2016, 12:15
von dot
Krishty hat geschrieben:Visual C++ muss das letztens mit einem Update eingeführt haben, oder?
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...

Re: (gelöst)[C++] komische operator delete-Überladung

Verfasst: 24.10.2016, 12:23
von Krishty
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.

Re: (gelöst)[C++] komische operator delete-Überladung

Verfasst: 24.10.2016, 12:33
von dot
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...