六帖のかたすみ

DVを受けていた男性。家を脱出して二周目の人生を生きています。自閉症スペクトラム(受動型)です。http://rokujo.org/ に引っ越しました。

C++ reallocはアドレスが変わる

知っている人には当たり前のことかもしれないけれど、デバッグで一度躓いたので。
メモリ容量が足りないからreallocをして容量を拡張しようとすると、なんとポインタの位置が変わってしまう。したがって、


LPSTR p;
/*何か読み込み処理*/
if(/*バッファ不足*/)
{
p = realloc(p, MAX_SIZE);
}
のようなことをしてはいけない。pの中身を他の変数で参照していたら、reallocした瞬間に他の変数が参照している場所が不正な位置になって、下手するとメモリ破壊、アクセスバイオレーションエラーになる。
また、reallocに失敗すればNULLが返ってくるから、pが参照しているアドレスが誰からも見えなくなってしまう。

LPSTR p;
/*何か読み込み処理*/
if(/*バッファ不足*/)
{
LPSTR ptmp = realloc(p, MAX_SIZE);
if(!ptmp)
{
/*エラー処理*/
return;
}
p = ptmp;
}
とするべきだそうだ。