Kumputer
Kumputer

Reputation: 726

c++ destructor calls a delete operator?

Why does my MSVC12 compiler not like this?

#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;
}

The error I get is oddly on the closing brace of main():

Error 2 error C2280: 'void thing::operator delete(void *)' : attempting to reference a deleted function

If I comment out the explicit destructor call, the error goes away, implying that the explicit destructor call is trying to call operator delete(void*). This does not make intuitive sense. As you can probably see from the code here, I've already managed my own memory, and I don't want anyone to call delete on thing ever.

Upvotes: 14

Views: 423

Answers (2)

Kumputer
Kumputer

Reputation: 726

The consensus in this thread is that this is a compiler bug unique to MSVC++. I have reported this to Microsoft here:

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

UPDATE: MS reports that the issue is resolved and will be available in the next VS update.

Upvotes: 3

Zak Goichman
Zak Goichman

Reputation: 71

This is definitely a bug since by simply replacing the virtual call to the destructor with a nonvirtual one: t1->thing::~thing() it works. But obviously in this case there is no inheritance involved and therefore no difference between the two forms.

You can try and submit the bug through the Microsoft Connect site for VS

Upvotes: 5

Related Questions