RealLoc()への複数の呼び出しはヒープの腐敗を引き起こすようです
-
24-10-2019 - |
質問
このコードの問題は何ですか?毎回クラッシュします。
一度は失敗したアサーション「_ asserte(_crtisvalidheappointer(puserdata)); "、時にはそれは単なる「ヒープの腐敗」エラーです。
バッファサイズを変更すると、この問題は奇妙な方法で影響します - 時には「realloc」でクラッシュし、他の時には「無料」でクラッシュします。
私はこのコードを何度もデバッグしましたが、ポインターに関して異常は何もありません。
char buf[2000];
char *data = (char*)malloc(sizeof(buf));
unsigned int size = sizeof(buf);
for (unsigned int i = 0; i < 5; ++i)
{
char *ptr = data + size;
size += sizeof(buf);
char *tmp = (char*)realloc(data, size);
if (!tmp)
{
std::cout << "Oh no..";
break;
}
data = tmp;
memcpy(ptr, buf, sizeof(buf));
}
free(data);
ありがとう!
解決
あなたは山をゴミ箱に捨てています。 realloc
それが再配分するので、まったく異なる場所からあなたの記憶を返すことを自由に選択できます、そして、これはあなたを無効にしています ptr
. 。設定 ptr
再配置後。
他のヒント
ここにループの2番目の反復に値があります
data
サイズのバッファーを指しますsizeof(buf)
size
の値がありますsizeof(buf)
これらの値を考えると、の値 ptr
割り当てられたバッファーの端を超えて指しているということです data
. 。これはプロセスと以下によって所有されていないメモリです memcpy
オペレーションはこれに書き込み、記憶を破壊します。
char *ptr = data + size;
char *tmp = (char*)realloc(data, size);
memcpy(ptr, buf, sizeof(buf));
通話 realloc()
新しいバッファーを返す前に、古いバッファーを解放する可能性があります。
所属していません StackOverflow