制御構造のブロック内で変数を定義した場合、それはその制御構造のブロックの実行にのみ存在し、囲んでいる関数の実行全体には存在しませんか?
変数を定義せずに宣言する場所によって異なります。
変数には、宣言したスコープでのみアクセスできます。明示的に渡すと、スコープを超えてアクセスできますが、有効なままであるかどうかは、変数のストレージタイプによって異なります。
たとえばstatic
、変数はプログラムの存続期間を通じて存続し
ますが、関数から自動変数のアドレスを返すと、関数が戻った後も変数が有効なままにならないため、未定義動作になります。
良い読み物:
定義と宣言の違いは何ですか?
プログラムの正確なメモリ使用量とその変更(つまり、変数の作成と破棄によるメモリ使用量の変更)を監視するにはどうすればよいですか?
自動オブジェクトはスコープ内で十分な長さしか存続しないため、動的に割り当てられたオブジェクトに関する情報を取得する必要があると思います。自動オブジェクトは自動的に破棄されるため、通常は問題は発生しません。
動的オブジェクトの場合valgrindなどのメモリプロファイリングツールをMassifで使用するか、クラスの演算子と演算子を置き換えnew
delete
て診断情報を収集することができます。
編集:更新されたQに対処します。
次のコードでは、v
スコープがブロックであることを知っていますが、ifブロックの開始/終了時または関数の開始/終了時にメモリ内で作成/破棄されたif
かどうかを知りたいですか?v
func
v
宣言されたスコープが開始され、宣言されたステートメントが実行されたときに作成されます。v
スコープが終了すると、つまり}
到達すると破棄されます。
この概念は、リソース割り当てとして知られるC ++で最も広く使用されている概念の1つであるInitialization(RAII)の基礎を形成するために使用されます。すべてのC++プログラマーは絶対にそれについて知っている必要があります。
この小さな変更されたコードサンプルを使用して、オブジェクトの作成と破棄をデモンストレーションおよび検証するのは簡単です。
#include<iostream>
class Myclass
{
public:
Myclass(){std::cout<<"\nIn Myclass Constructor ";}
~Myclass(){std::cout<<"\nIn Myclass Destructor";}
};
void func()
{
std::cout<<"\nBefore Scope Begins";
if (true)
{
Myclass obj;//automatic storage class
}
std::cout<<"\nAfter Scope Ends";
}
int main()
{
std::cout<<"\nBefore Calling func()";
func();
std::cout<<"\nAfter Calling func()";
return 0;
}
出力は次のとおりです。
func()を呼び出す
前スコープ
がMyclassコンストラクタで開始する前
Myclassデストラクタで
スコープが終了
した後func()を呼び出した後