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

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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?
Zuletzt geändert von Krishty am 24.10.2016, 11:45, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

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

Beitrag 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... ;)
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

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

Beitrag von dot »

always glad to help ^^
Benutzeravatar
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

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

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

Beitrag 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...
Benutzeravatar
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

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

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

Beitrag 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...
Antworten