1

このコードの問題点は何ですか? 毎回クラッシュします。

失敗したアサーション「_ASSERTE(_CrtIsValidHeapPointer(pUserData));」である場合もあれば、単なる「ヒープ破損」エラーである場合もあります。

バッファサイズを変更すると、この問題に奇妙な影響があります。「realloc」でクラッシュすることもあれば、「free」でクラッシュすることもあります。

このコードを何度もデバッグしましたが、ポインターに関して異常はありません。

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);

ありがとう!

4

3 に答える 3

1

あなたはヒープを捨てています。reallocは、再割り当て時にまったく別の場所からメモリを返すことを自由に選択できます。これにより、ptr. ptr再配置後に設定します。

于 2010-06-07T21:00:25.253 に答える
0

ループの 2 回目の反復では、値は次のとおりです。

  • dataサイズのバッファを指すsizeof(buf)
  • sizeの値を持っていますsizeof(buf)

これらの値を指定すると、 の値はptr、 に割り当てられたバッファの末尾を超えて指しているということになりdataます。これはプロセスによって所有されていないメモリであり、次のmemcpy操作はこれに書き込み、メモリを破損します。

于 2010-06-07T21:00:25.940 に答える
0
char *ptr = data + size;
char *tmp = (char*)realloc(data, size);
memcpy(ptr, buf, sizeof(buf));

ここへの呼び出しrealloc()は、新しいバッファーを返す前に古いバッファーを解放する可能性があります。

于 2010-06-07T21:01:41.087 に答える