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;
}
とするべきだそうだ。


コメントを残す

メールアドレスが公開されることはありません。