ユニオンでコンストラクタとデストラクタを読んでいたときに、スタックオーバーフローの質問に出くわしました。ユニオンメンバーのデストラクタが呼び出されましたか
その質問に対する受け入れられた答えは、文字列オブジェクトのデストラクタを明示的に提供する必要があるということです。ただし、C ++で文字列オブジェクトを削除するという一般的な回答については、文字列オブジェクトを明示的に削除しないでください。文字列がスコープ外になると、デストラクタが自動的に呼び出され、メモリが解放されます。
これら2つは矛盾しています。必要な場合でも、文字列を削除する方法を教えてください。また、どのオブジェクトを明示的に削除する必要がありますか?
仕様によると、ユニオンの非静的データメンバーに重要なデフォルトコンストラクター(12.1)、コピーコンストラクター(12.8)、ムーブコンストラクター(12.8)、コピー代入演算子(12.8)、ムーブ代入演算子(12.8)がある場合、またはデストラクタ(12.4)の場合、ユニオンの対応するメンバー関数はユーザーが指定する必要があります。そうしないと、ユニオンに対して暗黙的に削除されます(8.4.3)。しかし、重要とはどういう意味ですか?
些細なコンストラクタ/デストラクタは何もしないものです。基本的に、あなたの破壊者が次のように見える場合
~Type() {}
それからそれは些細なことです。std::string
のデストラクタはそのように空ではありません。文字列が割り当てた可能性のあるメモリをクリーンアップする必要があります。
したがって、ユニオンのデストラクタは何もしませんが、std::string
何かをする必要があるため(そうしないと、メモリリークが発生します)、文字列のデストラクタを呼び出すユニオンのデストラクタを指定して、正しくクリーンアップする必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加