RealLoc()への複数の呼び出しはヒープの腐敗を引き起こすようです

StackOverflow https://stackoverflow.com/questions/2993094

  •  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() 新しいバッファーを返す前に、古いバッファーを解放する可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top