2016-03-23 6 views
14

Почему мой компилятор MSVC12 не нравится?C++ destructor вызывает оператор удаления?

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

Я получаю ошибку странным образом на закрывающей фигурной основного():

Ошибка 2 Ошибка C2280: «аннулируются вещь :: оператор удаления (аннулируются *)»: попытка сослаться на удаленную функцию

Если я прокомментирую явный вызов деструктора, ошибка исчезнет, ​​подразумевая, что явный вызов деструктора пытается вызвать оператор delete (void *). Это не создает интуитивного смысла. Как вы можете видеть из кода здесь, я уже управлял своей собственной памятью, и я не хочу, чтобы кто-нибудь называл delete на вещи когда-либо.

+1

Это [компилирует и работает] (http://coliru.stacked-crooked.com/a/b0c0ca91f45c3887) в gcc5, как и должно быть. Что произойдет, если вы скомпилируете в режиме выпуска? – vsoftco

+1

[cpp.sh/3mqd](http://cpp.sh/3mqd) - gcc отлично работает –

+0

У версии с выпуском такая же ошибка. Кажется, это ошибка компилятора? – Kumputer

ответ

5

Это определенно ошибка , так как просто заменяя виртуальный вызов на деструктор неживым: t1->thing::~thing() он работает. Но очевидно, что в этом случае нет наследования и, следовательно, нет разницы между этими двумя формами.

Вы можете попытаться представить эту ошибку через the Microsoft Connect site for VS

+0

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

+0

Деструктор не является виртуальным –

+0

Это не так, но вызов, который использует явное имя метода, называется не виртуальным вызовом. –

3

Консенсус в этой теме, что это ошибка компилятора уникальный для MSVC++. Я сообщил об этом Microsoft здесь:

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

UPDATE: MS сообщает, что этот вопрос будет решен, и будет доступна в следующем обновлении VS.