clang でコンパイルすると結果が違う(デストラクタが呼ばれない)
以下のプログラムをコンパイルするとclangとGCCでは結果が違う 具体的にはmain関数内4番目のブロック { Base* ap = new Derived[2]; delete[] ap; } を、実行した場合 GCCでは、派生クラスのデストラクタとベースクラスのデストラクタが呼ばれる clangは、ベースクラスのデストラクタだけ呼ばれる(派生クラスのデストラクタは呼ばれない) この結果の違いはなぜ起こるのでしょうか?
該当のソースコード
c++
1#include <iostream> 2 3class Base { 4public: 5 Base() { 6 std::cout << "Base()" << std::endl; 7 } 8 virtual ~Base() { 9 std::cout << "~Base()" << std::endl; 10 } 11}; 12 13class Derived : public Base { 14public: 15 Derived() { 16 std::cout << "Derived()" << std::endl; 17 } 18 ~Derived() { 19 std::cout << "~Derived()" << std::endl; 20 } 21}; 22 23int main() 24{ 25 std::cout << "{\n Derived a;\n}" << std::endl; 26 27 // 1 28 { 29 Derived a; 30 } 31 32 std::cout << "------------------------" << std::endl; 33 std::cout << "{\n Derived ary[2];\n}" << std::endl; 34 35 // 2 36 { 37 Derived ary[2]; 38 } 39 40 std::cout << "------------------------" << std::endl; 41 std::cout << "{\n Base* p = new Derived;" << std::endl; 42 std::cout << " delete p;\n}" << std::endl; 43 44 // 3 45 { 46 Base* p = new Derived; 47 delete p; 48 } 49 50 std::cout << "------------------------" << std::endl; 51 std::cout << "{\n Base* ap = new Derived[2];" << std::endl; 52 std::cout << " delete[] ap;\n}" << std::endl; 53 54 // 4 55 { 56 Base* ap = new Derived[2]; 57 delete[] ap; 58 } 59} 60
試したこと
オンラインでコンパイル実行ができるサイトで
https://wandbox.org
http://rextester.com
試してみた結果もclangの場合だけ派生クラスのデストラクタが呼ばれませんでした
GCCとvc++は派生クラスのデストラクタも呼ばれる
補足情報(コンパイラのバージョン)
Apple LLVM version 9.1.0 (clang-902.0.39.2)
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/16 23:33