この質問は、ソースコードが原因で少し長くなります。ソースコードはできるだけ単純化しようとしました。ご容赦ください。一緒に読んでくれてありがとう。
何百万回も実行される可能性のあるループを持つアプリケーションがあります。malloc
そのループ内で数千から数百万の/呼び出しの代わりに、最初に1 つ、次に数千から数百万の呼び出しfree
を実行したいと考えています。malloc
realloc
しかし、私が使用しているときに、アプリケーションが数 GB のメモリを消費し、それ自体を強制終了するという問題が発生していますrealloc
。を使用するmalloc
と、メモリ使用量は問題ありません。
の memtestを使用して小規模なテスト データ セットを実行すると、またはvalgrind
のいずれでもメモリ リークは報告されません。malloc
realloc
すべてのmalloc
-ed (およびrealloc
-ed) オブジェクトと対応するfree
.
したがって、理論的には、メモリリークはしていませんrealloc
。使用可能なRAMをすべて消費しているように見えるだけです。その理由とこれを修正するためにできることを知りたいです。
私が最初に持っているのは、次のようなもので、malloc
適切に使用および機能します。
マロックコード
void A () {
do {
B();
} while (someConditionThatIsTrueForMillionInstances);
}
void B () {
char *firstString = NULL;
char *secondString = NULL;
char *someOtherString;
/* populate someOtherString with data from stream, for example */
C((const char *)someOtherString, &firstString, &secondString);
fprintf(stderr, "first: [%s] | second: [%s]\n", firstString, secondString);
if (firstString)
free(firstString);
if (secondString)
free(secondString);
}
void C (const char *someOtherString, char **firstString, char **secondString) {
char firstBuffer[BUFLENGTH];
char secondBuffer[BUFLENGTH];
/* populate buffers with some data from tokenizing someOtherString in a special way */
*firstString = malloc(strlen(firstBuffer)+1);
strncpy(*firstString, firstBuffer, strlen(firstBuffer)+1);
*secondString = malloc(strlen(secondBuffer)+1);
strncpy(*secondString, secondBuffer, strlen(secondBuffer)+1);
}
これはうまくいきます。しかし、私はもっと速いものが欲しいです。
realloc
ここで、配置をテストします。これはmalloc
-s が 1 回だけです。
再割り当てコード
void A () {
char *firstString = NULL;
char *secondString = NULL;
do {
B(&firstString, &secondString);
} while (someConditionThatIsTrueForMillionInstances);
if (firstString)
free(firstString);
if (secondString)
free(secondString);
}
void B (char **firstString, char **secondString) {
char *someOtherString;
/* populate someOtherString with data from stream, for example */
C((const char *)someOtherString, &(*firstString), &(*secondString));
fprintf(stderr, "first: [%s] | second: [%s]\n", *firstString, *secondString);
}
void C (const char *someOtherString, char **firstString, char **secondString) {
char firstBuffer[BUFLENGTH];
char secondBuffer[BUFLENGTH];
/* populate buffers with some data from tokenizing someOtherString in a special way */
/* realloc should act as malloc on first pass through */
*firstString = realloc(*firstString, strlen(firstBuffer)+1);
strncpy(*firstString, firstBuffer, strlen(firstBuffer)+1);
*secondString = realloc(*secondString, strlen(secondBuffer)+1);
strncpy(*secondString, secondBuffer, strlen(secondBuffer)+1);
}
free -m
100 万ループ状態を引き起こす大規模なデータ セットを使用してこの ベースのテストを実行しているときに、コマンド ラインで の出力を見るとrealloc
、メモリが 4 GB から 0 に減少し、アプリがクラッシュします。
realloc
これを引き起こしている使用について何が欠けていますか? ばかげた質問で申し訳ありませんが、アドバイスをよろしくお願いします。