50

私のC++ 11コードでは、次の場合に「宣言には終了時のデストラクタが必要です」というclang警告が表示されます。

static const std::map<int, const someStruct> mymap = {
    {1, {
        "A",
        "B",
        "C"
    }},
    {2, {
        "D",
        "E",
        "F"
    }}
};

私が理解している限り、「既に解放された変数」による終了時のクラッシュを防ぐために、確定的な方法で main() と statics を破棄するには、「終了時デストラクタ」が必要です。そうですか?誰かがそれをよりよく説明できますか?

プラス: どうすればよいですか (警告を無効にしたくありません)。上記のコードは、1 つのスレッドのコンテキスト内でのみ使用されます。

これが Chromium がこれらのケースに対処する方法のようです。それは私の場合にも正しい方法でしょうか?

#define CR_DEFINE_STATIC_LOCAL(type, name, arguments) \
  static type& name = *new type arguments

(出典: https://chromium.googlesource.com/chromium/src/+/32352ad08ee673a4d43e8593ce988b224f6482d3/base/basictypes.h )

4

2 に答える 2

27

グローバルおよび関数静的オブジェクトは、アプリケーションの終了時に呼び出されるデストラクタを取得します。これらのデストラクタは「終了時デストラクタ」です。構築されたときとは逆の順序で呼び出されます。

あなたが言ったように、これらのデストラクタの一部がすでに破棄されたオブジェクトに触れると、プログラムがクラッシュする可能性があります。また、終了時にデストラクタを実行すると、プログラムの終了が遅くなり、ほとんどの場合、プログラムの正確さには必要ありません (プログラムが終了すると、すべてのメモリが解放されるため)。

警告は、終了時に実行されるデストラクタがあることを単に指摘しているだけです。

あなたが提案した修正は、オブジェクトをヒープに割り当てます。これにより、プログラムの終了時にオブジェクトが自動的に破棄されることはありません。あなたの場合、おそらくこれで十分です。

于 2013-01-15T10:27:27.680 に答える