-2

私はANSI Cに取り組んでいます。

charの配列で作成された文字列オブジェクトがあります..オブジェクトがメモリリークを起こすと思います..プログラムを約5分間(おそらく10000回の繰り返し)実行すると、使用メモリがどんどん大きくなります..

free および delete 関数を使用して、オブジェクトの使用済みメモリを解放しようとしました。ただし、削除は有効な機能ではありません。反対側では、フリーが最初にうまく実行されているように見えます。しかし、私はfree():invalid pointer..

どうすればこれを修正できますか? 私はそれを別の方法で行うことができますか?


ここに私のコードの一部があります..

char *ext;
ext = calloc(20, sizeof(char));
//do something with ext
free(ext);
4

3 に答える 3

1

C では、 でヒープにメモリを割り当てmalloc、 で解放しfreeます。だからあなたはそこで正しいです。 deleteは C++ で使用され、メモリが演算子で割り当てられた場合にのみ使用されnewます。

への呼び出しで無効なポインタ エラーが発生するfree場合は、コードのどこかにバグがある可能性があります。投稿していただければ、調査いたします。

于 2011-06-18T09:46:03.827 に答える
1

割り当てられたメモリの最後を超えて書き込んでいる可能性があります。と

calloc(20, sizeof(char))

20 文字分のスペースを割り当てます (19 文字の「通常」と文字列のヌル ターミネータ)。

を超える「通常の」文字を書き込もうとしていないことを十分確認してください。strcat()str[18]

于 2011-06-18T10:36:56.280 に答える
0

これ以上のコードなし:

  1. ext が指す直前のメモリ内の配列は、そのストレージをオーバーランし、malloc() が free() への後続の呼び出しのためにメモリのサイズを追跡するために使用するタイプの「ヘッダー」を破損しました (((size_t *)ext を考えてください)。 )[-1] malloc からのサイズを保持)。
  2. 同じ破損を行った ext[negative] に負の配列インデックスを使用しました。
  3. ext が何らかの形で変更されます。
于 2011-06-18T10:52:40.580 に答える