ページ 11

変数のアドレスについて

Posted: 2012年3月28日(水) 14:54
by dig
はじめて質問させていただきます。よろしくお願いします。

C++のstaticやグローバル以外の変数のアドレスはプログラム実行中は不変なのでしょうか?

たとえば
img = &tempImage;

などとポインタにアドレスを渡すとします。このimgはプログラム終了まで常にtempImageを指すのでしょうか?
回答よろしくお願いします。

Re: 変数のアドレスについて

Posted: 2012年3月28日(水) 15:03
by softya(ソフト屋)
正確に書くためにアドレスと呼ばずにポインタ値と呼ばさせてもらいます。

ローカル変数などの自動変数の寿命はスコープ範囲内ですので、それを過ぎた後はポインタ値が指していた変数は存在しない物と思って下さい。通常はその変数が占めていたメモリ空間は別の変数のために使われます。
たまたま、そのメモリ空間を使っていない可能性はありますが単なる偶然です。
スコープ内で変数の寿命が一度でも尽きない限りは変数のポインタ値が指す変数が存在することは保証されますが、スコープ外に出た場合ローカル変数が毎回同じポインタ値になる保証もありません。

Re: 変数のアドレスについて

Posted: 2012年3月28日(水) 15:14
by dig
ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?

たとえば
img = &image.tempImage;

この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?

Re: 変数のアドレスについて

Posted: 2012年3月28日(水) 15:36
by softya(ソフト屋)
dig さんが書きました:ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?

たとえば
img = &image.tempImage;

この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
クラスのインスタンスが生存しているのなら存在はしています。
ただ、クラスのメンバ変数のアドレスを公開するのはオブジェクト指向的にマズイのでは?と言う問題は置いておいての話です。
場合によっては避けれない場合もあるかも知れませんが極力避けるべき設計です。

Re: 変数のアドレスについて

Posted: 2012年3月28日(水) 15:40
by dig
softya(ソフト屋) さんが書きました:
dig さんが書きました:ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?

たとえば
img = &image.tempImage;

この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
クラスのインスタンスが生存しているのなら存在はしています。
ただ、クラスのメンバ変数のアドレスを公開するのはオブジェクト指向的にマズイのでは?と言う問題は置いておいての話です。
場合によっては避けれない場合もあるかも知れませんが極力避けるべき設計です。

理解できました。素早い返信ありがとうございました。

Re: 変数のアドレスについて

Posted: 2012年3月28日(水) 15:46
by たかぎ
dig さんが書きました:ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?

たとえば
img = &image.tempImage;

この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
一応補足しておくと...
上記の場合だと、imageの生存期間が終わる前であり、かつ単項の&演算子が多重定義されていなければ、同じアドレスを指すと考えて問題ありません。
単項の&演算子が多重定義されていた場合、それがどんな値を返すかは定義内容に依存しますので、これだけの情報では正確なことは何も言えません。

Re: 変数のアドレスについて

Posted: 2012年3月29日(木) 10:10
by dig
たかぎ さんが書きました:
dig さんが書きました:ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?

たとえば
img = &image.tempImage;

この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
一応補足しておくと...
上記の場合だと、imageの生存期間が終わる前であり、かつ単項の&演算子が多重定義されていなければ、同じアドレスを指すと考えて問題ありません。
単項の&演算子が多重定義されていた場合、それがどんな値を返すかは定義内容に依存しますので、これだけの情報では正確なことは何も言えません。

返信遅れてすいません。詳しい説明ありがとうございました。(なお、&演算子は多重定義されておりません。)