2016-03-23 13 views
14

Warum mag mein MSVC12-Compiler das nicht?C++ Destruktor ruft einen Löschoperator auf?

#include <new> 

class thing 
{ 
public: 
    thing() {} 
    ~thing() {} 
    static void operator delete(void* ptr) = delete; 
}; 

int main() 
{ 
    int g; 
    void* p = &g; 
    thing* t1 = new(p) thing(); 
    t1->~thing(); 

    return 0; 
} 

Der Fehler, den ich bekommen ist seltsam auf der schließenden Klammer der main():

Fehler 2 Fehler C2280: 'Leere Sache :: operator delete (void *)': Der Versuch, eine gelöschte Funktion zu verweisen

Wenn ich den expliziten Destruktoraufruf auskommentiert, verschwindet der Fehler, was impliziert, dass der explizite Destruktoraufruf versucht, den Operator delete (void *) aufzurufen. Dies macht keinen intuitiven Sinn. Wie Sie aus dem Code hier sehen können, habe ich bereits meinen eigenen Speicher verwaltet, und ich möchte nicht, dass irgendjemand jemals etwas löschen möchte.

+1

Es [kompiliert und arbeitet] (http://coliru.stacked-crooked.com/a/b0c0ca91f45c3887) in gcc5, wie es sollte. Was passiert, wenn Sie im Freigabemodus kompilieren? – vsoftco

+1

[cpp.sh/3mqd](http://cpp.sh/3mqd) - gcc funktioniert gut –

+0

Release-Build hat den gleichen Fehler. Scheint das ein Compiler Bug? – Kumputer

Antwort

5

Dies ist definitiv ein Fehler da einfach durch den virtuellen Aufruf des Destruktor mit einem nichtvirtuellen Aufruf ersetzt: t1->thing::~thing() es funktioniert. Aber offensichtlich ist in diesem Fall keine Vererbung beteiligt und daher auch kein Unterschied zwischen den beiden Formen.

Sie können versuchen, und den Fehler durch the Microsoft Connect site for VS

+0

https://connect.microsoft.com/VisualStudio/Feedback/Details/2511044 – Kumputer

+0

Der Destruktor ist nicht virtuell –

+0

Es ist nicht, aber ein Aufruf, der den expliziten Methodennamen verwendet, wird als nicht virtueller Aufruf bezeichnet. –