VC2008 deleteの挙動について
Posted: 2010年5月01日(土) 12:59
お久しぶりです。
少々調べても分からない、というよりどう調べると良いのか分からない事が発生したので質問します。
動的にメモリを確保する際以下のように記述したとします。
int* pi = new int[ 100 ];
delete pi;
こうするとpiに代入されるポインタから「sizeof(int)*100」分のメモリが確保され、
deleteで解放されると思います。
この挙動を特に調べたわけでもなく自作するメモリ管理構造のように、ポインタアドレス等をキーに
確保したサイズとかの情報をどこかに確保しているのだと思っていました。
ところが先日とあるソース内に違和感を感じる処理がありました。上述したソースを流用して同じことを書くと
(処理1)
int* aryP[ 10 ];
for( int i = 0; i < 10; i++ )
aryP[ i ] = pi + i * 10;
(処理2)
for( int i = 0; i < 10; i++ )
delete aryP[ i ];
この処理を通るようにしても落ちたりはしなかったんですが、
たまたまなのか最適化によって上手く変換されてるのか分かりません。
処理2では確かに確保した領域のアドレスを渡してると思うのですが、
そもそもループ最初の「delete aryP[ 0 ]」でどれだけのメモリが解放されているのか・・・
そのあたりがよく分からないので質問します。
1.newで確保した情報はどのように管理されているのか
2.delete時は内部的にどのような処理が走るのか
3.1、2の管理はもしかしてコンパイラやOS依存になるのか
実行環境は
VC2008 OS WinXP Home SP3になります。
少々調べても分からない、というよりどう調べると良いのか分からない事が発生したので質問します。
動的にメモリを確保する際以下のように記述したとします。
int* pi = new int[ 100 ];
delete pi;
こうするとpiに代入されるポインタから「sizeof(int)*100」分のメモリが確保され、
deleteで解放されると思います。
この挙動を特に調べたわけでもなく自作するメモリ管理構造のように、ポインタアドレス等をキーに
確保したサイズとかの情報をどこかに確保しているのだと思っていました。
ところが先日とあるソース内に違和感を感じる処理がありました。上述したソースを流用して同じことを書くと
(処理1)
int* aryP[ 10 ];
for( int i = 0; i < 10; i++ )
aryP[ i ] = pi + i * 10;
(処理2)
for( int i = 0; i < 10; i++ )
delete aryP[ i ];
この処理を通るようにしても落ちたりはしなかったんですが、
たまたまなのか最適化によって上手く変換されてるのか分かりません。
処理2では確かに確保した領域のアドレスを渡してると思うのですが、
そもそもループ最初の「delete aryP[ 0 ]」でどれだけのメモリが解放されているのか・・・
そのあたりがよく分からないので質問します。
1.newで確保した情報はどのように管理されているのか
2.delete時は内部的にどのような処理が走るのか
3.1、2の管理はもしかしてコンパイラやOS依存になるのか
実行環境は
VC2008 OS WinXP Home SP3になります。