7

コンパイラは多くの最適化を行うことができます (一部の関数をインライン化するなど)。ローカル変数に割り当てられたすべてのメモリが、私のプログラムで関数を呼び出した後にクリアされるわけではないのではないかと少し疑っています (OS X のシステム モニターに基づく)。それが私が尋ねている理由です: ローカル変数のすべてのデストラクタが、スコープから出た瞬間に正確に呼び出されることが標準によって保証されていますか?

4

5 に答える 5

11

はい。C++11 標準のパラグラフ 3.7.3 によると:

register明示的に宣言された、または明示的に宣言されていないstatic、または自動ストレージ期間externを持つブロックスコープ変数。これらのエンティティのストレージは、エンティティが作成されたブロックが終了するまで続きます

ただし、これは自動保存期間を持つ変数に関係することに注意してください。でオブジェクトを動的に作成しnew、その結果をローカルの raw ポインターに割り当てた場合、ポイントされたオブジェクトではなく、raw ポインターのみが破棄されます。

{
    int* foo = new int(42);
} // Here you have a memory leak: the foo pointer is destroyed,
  // but not the object foo pointed to
于 2013-04-28T17:17:11.200 に答える
7

はい、保証されています。

Monitoring memory usage with system monitor might be not precise, because application does not return memory to the system. Once allocated it belongs to the application and even if your objects are destroyed you might not see any difference.

If you want to guarantee that your application does not have memory leaks you may want to use such tools as valgrind, or drMemory from google, or several others (google for "memory leak detection"). In this case you will have the most precise information about allocations, deallocations, leaks, memory access violations etc.

于 2013-04-28T17:17:18.103 に答える
3

はい、スコープ外に出るすべての変数が呼び出されるデストラクタを取得することが保証されています。

6.7 宣言文

2 自動保存期間 (3.7.3) を持つ変数は、それらの宣言ステートメントが実行されるたびに初期化されます。ブロックで宣言された自動保存期間を持つ変数は、ブロックの終了時に破棄されます(6.6)。

于 2013-04-28T17:14:31.523 に答える
1

次のようなコードがある場合は、次のようになります。

void f()
{
  A a;  // create a local instance of A
        // memory will be allocated on the stack, 
        // and the constructor for `a` will be called.

  // various code here

  // here at the end of the scope, 
  // the destructor for `a` will be called,
  // and the memory on the stack will be freed.
}
于 2013-04-28T17:22:35.767 に答える
1

はい、これは常に発生します。これは C++ によって保証されています。C++ FAQ liteから:

[11.5] ローカル変数に対して明示的にデストラクタを呼び出す必要がありますか?

いいえ!

デストラクタは、ローカルが作成されたブロックの終了時に再度呼び出されます。これは言語の保証です。それは自動的に起こります。それを止める方法はありません。しかし、同じオブジェクトに対してデストラクタを 2 回呼び出すと、非常に悪い結果になる可能性があります。バン!あなたは死んでいる!


それはあなたの質問を少し超えていますが、基本は同じです。

于 2013-04-28T17:20:20.150 に答える