実行がブロックを離れた後でも、C ++で、ブロックで定義されたローカル(非静的でブロック内)変数が破棄されるか、ポインターがそれを指している限りそうでないかを思い出すのに苦労しています。ブロック内に int を作成し、グローバル ポインターを持っていて、ブロックを離れた場合、ポインターはその int を見つけることができますか?
これに対する明確な回答がオンラインで見つかりませんでしたが、おそらく複数回回答されていると思いますが、申し訳ありません。
実行がブロックを離れた後でも、C ++で、ブロックで定義されたローカル(非静的でブロック内)変数が破棄されるか、ポインターがそれを指している限りそうでないかを思い出すのに苦労しています。ブロック内に int を作成し、グローバル ポインターを持っていて、ブロックを離れた場合、ポインターはその int を見つけることができますか?
これに対する明確な回答がオンラインで見つかりませんでしたが、おそらく複数回回答されていると思いますが、申し訳ありません。
いいえ、あなたは未定義の行動領域にいます。
次のような意味だと思います。
int* p = NULL;
{
int x = 0;
p = &x;
}
//p is a dangling pointer
p
の後で逆参照しようとすると}
、問題が発生します (または、さらに悪いことに、そうではなく、動作しているように見えます)。
ただし、ポインターを再割り当てできるため、次のようなものです
p = new int();
完全にOKです。
new
ただし、以下は有効です (またはを使用して動的メモリを割り当てる代わりにmalloc
):
int* p = NULL;
{
static int x = 0;
p = &x;
}
*p = 0;
スコープ内で定義された変数またはオブジェクト (ステートメント ブロック、複合ステートメント、または単にブロックと呼ばれる中括弧で区切られたブロック) は、自動有効期間または期間があるため、自動変数と呼ばれます。それらが定義されている範囲は終了します。通常、これは関数本体 (ローカル スコープ) が終了したときに発生します。
void function()
{
X obj; // object of type X is created here
} // local scope ends here: obj is destroyed
参照またはポインターをローカル自動変数にバインドすると、関数が終了したときに解放されるメモリ内の場所のアドレスを取得しているため、問題が発生します。標準では何を指定していないためです次に起こる可能性があり、動作は未定義であると言われ、ポインタはぶら下がっていると言われています:
X *ptr=nullptr;
void function()
{
X obj;
ptr=&obj;
} // obj is destroyed here: what does ptr points to now??
(キーワードnewを使用して) メモリを動的に割り当てる場合、スコープが終了したときにコンパイラによって処理されるローカル オブジェクトを作成するのではなく、記述したコードによって有効期間が決定されるオブジェクトを作成します。あなたはそれを作成する責任があり、その処分を担当しています。これは、それへのポインターでdeleteを呼び出して実行します。
X *ptr=nullptr;
void function()
{
ptr=new X;
} // nothing is destroyed here: ptr still points to an (unnamed) object of type X
オブジェクトの型は関係ありません。これは、プリミティブ型または組み込み型とユーザー定義型またはクラス型に等しく適用されます。