- 締切済み
reallocの断片化対策について
初めにお断りしておきたい事があります。 出先で緊急な事でしたので、今即興で書いたソースになります。 Cコンパイル環境が有りませんでしたので、動作確認がとれておりません。 その為、ケアレスミス等有るかもしれませんがご容赦願います。 例として標準入力より文字列を取得する処理を記述しました。 以下の処理でreallocの際の断片化対策となるでしょうか。 (最終的に*strにセットされている領域が断片化されていない事) 実際の処理では1行辺り0~30000文字程の可変長の文字列を読み込む事を想定しております。 C(windows)のみ可でC++は不可になります。 その他、冗長な記述等指摘が有りましたらよろしくお願い致します。 #define MAX_BUF_SIZE 128 int getText(char **str) { char *buf[MAX_BUF_SIZE]; char *tmp = NULL; int tmpsize = 0; if ((tmp = (char*) malloc(1)) == NULL) { return FALSE; } *tmp = '\0'; while (fgets(buf, MAX_BUF_SIZE, stdin) != NULL) { tmpsize += MAX_BUF_SIZE; if ((tmp = realloc(tmp, tmpsize)) == NULL) { free(tmp); return FALSE; } strcat(tmp, buf); } if (*str != NULL) { free(*str); } if (*str = (char*) malloc(strlen(tmp) + 1) != NULL) { return FALSE; } strcpy(*str, tmp); free(tmp); return TRUE; }
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>free(NULL); してしまい 確かfree にNULLポインタが渡された場合、free は、"何もしない" と思いました
- ataka304
- ベストアンサー率40% (9/22)
>はい、そうです。 >今までreallocで確保を繰り返していたのでメモリ上>でフラグメンテーションが起こっているとの指摘で>したので。 じゃあこのソースでもだめです。 WindowsならVirtualAllocとかで予め大きく仮想メモリを予約しておくとかで解決できるかもしれません。 それかreallocで大き目にメモリ確保してreallocの回数を減らすようにしてみるべきです。
- ataka304
- ベストアンサー率40% (9/22)
while (fgets(buf, MAX_BUF_SIZE, stdin) != NULL) { tmpsize += MAX_BUF_SIZE; if ((tmp = realloc(tmp, tmpsize)) == NULL) { free(tmp); return FALSE; } strcat(tmp, buf); } それよりも、このstrcatは危険です。 確かreallocは新たに増加した分のメモリ初期化をしません。 この点には注意してください。
お礼
> 確かreallocは新たに増加した分のメモリ初期化をしません。 > この点には注意してください。 ご指摘ありがとうございます。 了解しました。
- Tacosan
- ベストアンサー率23% (3656/15482)
何を心配しているのか不明ですが, malloc で確保されたメモリは (少なくとも) 引数で指定された分だけは連続しているにきまっています. もちろん, realloc を繰り返したときに「それらが連続しているか」は全くわかりません. むしろ if ((tmp = realloc(tmp, tmpsize)) == NULL) { free(tmp); return FALSE; } の方が危険. realloc が NULL を返すと tmp == NULL となって free(NULL); してしまい, それまでに確保していた分を解放できなくなってしまいます.
お礼
> 何を心配しているのか不明ですが 今までreallocを繰り返していたので、mallocで再確保して文字列コピーする事によって断片化を解消しようと考えました。 > realloc が NULL を返すと tmp == NULL となって free(NULL); してしまい, それまでに確保していた分を解放できなくなってしまいます. ご指摘ありがとうございます。 対処致します。 とりあえず*strに期待通りに確保出来ている事が判りましたので、締め切らせていただきます。 どうもありがとうございました。
- ataka304
- ベストアンサー率40% (9/22)
断片化って実メモリ上の断片化の話をしていますか?
お礼
はい、そうです。 今までreallocで確保を繰り返していたのでメモリ上でフラグメンテーションが起こっているとの指摘でしたので。
お礼
> WindowsならVirtualAllocとかで予め大きく仮想メモリを予約しておくとかで解決できるかもしれません。 > それかreallocで大き目にメモリ確保してreallocの回数を減らすようにしてみるべきです。 ありがとうございます。 やはりreallocで実装する場合は回数を減らすしかないのですね。