はじめて質問させていただきます。よろしくお願いします。
C++のstaticやグローバル以外の変数のアドレスはプログラム実行中は不変なのでしょうか?
たとえば
img = &tempImage;
などとポインタにアドレスを渡すとします。このimgはプログラム終了まで常にtempImageを指すのでしょうか?
回答よろしくお願いします。
変数のアドレスについて
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 変数のアドレスについて
正確に書くためにアドレスと呼ばずにポインタ値と呼ばさせてもらいます。
ローカル変数などの自動変数の寿命はスコープ範囲内ですので、それを過ぎた後はポインタ値が指していた変数は存在しない物と思って下さい。通常はその変数が占めていたメモリ空間は別の変数のために使われます。
たまたま、そのメモリ空間を使っていない可能性はありますが単なる偶然です。
スコープ内で変数の寿命が一度でも尽きない限りは変数のポインタ値が指す変数が存在することは保証されますが、スコープ外に出た場合ローカル変数が毎回同じポインタ値になる保証もありません。
ローカル変数などの自動変数の寿命はスコープ範囲内ですので、それを過ぎた後はポインタ値が指していた変数は存在しない物と思って下さい。通常はその変数が占めていたメモリ空間は別の変数のために使われます。
たまたま、そのメモリ空間を使っていない可能性はありますが単なる偶然です。
スコープ内で変数の寿命が一度でも尽きない限りは変数のポインタ値が指す変数が存在することは保証されますが、スコープ外に出た場合ローカル変数が毎回同じポインタ値になる保証もありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 変数のアドレスについて
ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?
たとえば
img = &image.tempImage;
この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
たとえば
img = &image.tempImage;
この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 変数のアドレスについて
クラスのインスタンスが生存しているのなら存在はしています。dig さんが書きました:ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?
たとえば
img = &image.tempImage;
この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
ただ、クラスのメンバ変数のアドレスを公開するのはオブジェクト指向的にマズイのでは?と言う問題は置いておいての話です。
場合によっては避けれない場合もあるかも知れませんが極力避けるべき設計です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 変数のアドレスについて
softya(ソフト屋) さんが書きました:クラスのインスタンスが生存しているのなら存在はしています。dig さんが書きました:ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?
たとえば
img = &image.tempImage;
この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
ただ、クラスのメンバ変数のアドレスを公開するのはオブジェクト指向的にマズイのでは?と言う問題は置いておいての話です。
場合によっては避けれない場合もあるかも知れませんが極力避けるべき設計です。
理解できました。素早い返信ありがとうございました。
Re: 変数のアドレスについて
一応補足しておくと...dig さんが書きました:ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?
たとえば
img = &image.tempImage;
この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
上記の場合だと、imageの生存期間が終わる前であり、かつ単項の&演算子が多重定義されていなければ、同じアドレスを指すと考えて問題ありません。
単項の&演算子が多重定義されていた場合、それがどんな値を返すかは定義内容に依存しますので、これだけの情報では正確なことは何も言えません。
Re: 変数のアドレスについて
たかぎ さんが書きました:一応補足しておくと...dig さんが書きました:ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?
たとえば
img = &image.tempImage;
この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
上記の場合だと、imageの生存期間が終わる前であり、かつ単項の&演算子が多重定義されていなければ、同じアドレスを指すと考えて問題ありません。
単項の&演算子が多重定義されていた場合、それがどんな値を返すかは定義内容に依存しますので、これだけの情報では正確なことは何も言えません。
返信遅れてすいません。詳しい説明ありがとうございました。(なお、&演算子は多重定義されておりません。)