なーんか,動的なメモリ確保って怖いのよねー.
じゃって,わしオッコチョイ(古ッ!)じゃから,領域解放し忘れそうなんだもーん・・・
んで,こんな感じで動的なメモリ確保をしてたのよね.
ポインタが領域を確保してないときは,必ずNULLを指すようにしておく.
逆にいえば,ポインタがNULL以外を指すときは,何かしらの領域を確保中.
んで,この原則を守るために,実際こんな感じでコーディングしてました.
// ここはプログラム開始地点と思ってね.
// 初期化の時点でNULLを指すようにして置く.
char * p = NULL ;
.......
// メモリ確保しよー
// でも,ポインタが既に領域確保してるときはダメ!
// つまり,NULL以外のときはダメ!!
if ( p == NULL )
p = new char ;
......
// 領域使用するとき
// でも確保してるときだけよん.
if ( p != NULL ) {
p = 100 ;
p ++ ;
}
......
// 要らなくなったら,領域解放!
// 既に確保されてるときだけよ.
// NULLのときは解放しないように!
// 解放したらすぐさまNULLに!
if ( p != NULL ) {
delete p ;
p = NULL ;
}
ってしてまーす.
そういや,「deleteはNULLを指してるポインタに関しては解放を行わない」って噂を聞いた.
ほえー,そうにゃの?
んじゃ,最後のメモリ確保の部分は,
ていう部分を、
// 要らなくなったら,領域解放!
// 既に確保されてるときだけよ.
// NULLのときはdeleteが何もしないよん
delete p ;
p = NULL ;
って感じで,条件分岐いらない訳ね.
まぁ,最初の方法でも問題無いと思うんだけどね.(ていうか書き直してもメリット無いね)
あーあと,「new」ってメモリ確保に失敗しても,絶対NULLを返すってわけじゃないのねー,
C++のバージョン(?)によっては…
Cの 「malloc」じゃ,確保失敗時にはNULLを返すのにね
ふーむ,それにしても結局こんなメモリ確保,解放のコーディング方法は正しいのかな?
誰か教えてほしいなー.
< Back to Diary.