2016-03-23 12 views
14

なぜ私のMSVC12コンパイラはこれを好まないのですか?C++デストラクタは削除演算子を呼び出しますか?

エラー2エラーC2280:

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

私が手にエラーがメイン()の閉じ括弧の上に奇妙である「空の事::演算子を削除(無効*)」:削除された関数を参照しようとします

明示的なデストラクタ呼び出しをコメントアウトすると、明示的なデストラクタ呼び出しがdelete(void *)演算子を呼び出そうとしていることを意味するエラーはなくなります。これは直感的な意味を持っていません。おそらくここのコードからわかるように、私は自分の記憶をすでに管理しています。

+1

これはgcc5の[コンパイルと動作](http://coliru.stacked-crooked.com/a/b0c0ca91f45c3887)です。リリースモードでコンパイルするとどうなりますか? – vsoftco

+1

[cpp.sh/3mqd](http://cpp.sh/3mqd) - gccが正常に動作します –

+0

リリースビルドに同じエラーがあります。これはコンパイラのバグだと思われますか? – Kumputer

答えて

5

これは間違いなくバグ です。デストラクタへの仮想呼び出しを非仮想のものに置き換えるだけで、t1->thing::~thing()が動作するからです。しかし、明らかにこのケースでは継承が関与していないので、2つの形式の違いはありません。

あなたはこのスレッドでのコンセンサスは、これはMSVC++に固有のコンパイラのバグがあるということですthe Microsoft Connect site for VS

+0

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

+0

デストラクタは仮想ではありません –

+0

明示的なメソッド名を使用する呼び出しは、非仮想呼び出しと呼ばれます。 –