30

C++11 では、標準のレイアウト タイプを使用できるようになりましたunion共用体のメンバーにはユーザー定義のコンストラクターがあります

私の質問は次のとおりunionです。範囲外になったときにカスタムデストラクタが呼び出されることは保証されていますか?

私の理解では、切り替え時に手動で破棄および構築する必要があります: http://en.cppreference.com/w/cpp/language/union#Explanation

しかし、次のような例はどうでしょうか。

{
    union S { string str;
              vector<int> vec;
              ~S() {} } s = { "Hello, world"s };
}

範囲外になった場合、のデストラクタsを呼び出していないため、ヒープに割り当てられた文字列のメモリ リークが発生したのでしょうか。string

4

3 に答える 3

4

あなたの例はコンパイルされません。デフォルトでは、共用体にはデストラクタが削除されています。もちろん、どのデストラクタを呼び出す必要がありますか? 確かに両方を呼び出すことはできません。また、実際に構築されたメンバーに関する情報はどこにも保存されていません。適切なデストラクタを提供するのはあなた次第です。

コード スニペットをコンパイルしようとしたときの GCC の出力は次のとおりです。

In function ‘int main()’:
error: use of deleted function ‘main()::<anonymous union>::~<constructor>()’
       vector<int> vec; } s = { "Hello, world"s };
                                                ^

note: ‘main()::<anonymous union>::~<constructor>()’ is implicitly deleted because the default definition would be ill-formed:
      union { string str;
            ^
于 2016-10-18T11:38:13.037 に答える