
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
No.2です。
これはNGだよ。
for文使ってm回(28561回)のmalloc()をしてるんだよね。
それに対して、free()はfor文を出たあとの1回だけでしょ。
てことは、28561回目に確保したメモリだけは解放されるけど、1~28560回目までに確保しまくったメモリは解放されない(中に浮いたまま)ということになるからね。
当然パンクします。
free()をfor文の中に入れて、その確保したメモリが不必要になった都度free()するといいんじゃないかな。要はmalloc()とfree()が対になるようにするということ。
そうすればメモリの確保と解放のバランスというか論理性が取れて、少なくとも質問欄に書いたようなことはなくなると思うよ。
※1回ごとのメモリ確保量がどれくらいか、面倒だから見てないけど、それは気を付けてください。
いくらmalloc()とfree()のつじつまがあってたって、一度に100MBとか確保しようとしたら、環境にもよるけど、まずダメだからね。
まあ、コードを見る限り構造体一つ分のメモリを確保しようとしているだけだから、常識的に考えてOKだとは思うけど。
No.3
- 回答日時:
rもqもm回mallocしてますが、解放は最後の1回だけしかしてませんのでメモリ補足になるのは当たり前だと思います。
rとqを配列にしてループ回数格納するか、ループの範囲が間違ったプログラムだと思います。
No.2
- 回答日時:
そんなことあり得ないとおもうけど...
ちょっとここに、具体的にどんな感じでmallocとfreeを使ってるか書いてみては?
あんまり長いと読む気なくなるから、不要なコードは削除して20行程度で。
よく新人さんである話だけど、
char *a = (char *)malloc(100);
とかやっといて、
free( *a ); とかやってない? 或いは free( &a ) とか。
もしやってるとすると全然おかしなところを解放していることになるよ。
crew21様
ご回答ありがとうございます.
コードの方,書かせていただきます.
void dijkstra(struct edge *E, struct edge *T, float *dstar, int n, int m, int m2, int st){
struct cell *adjlist[N]; /* グラフの隣接リスト */
struct cell *r, *q, *p;
m=28561;
for(i=0; i<m; i++){
v1=E[i].end1;
v2=E[i].end2;
r=(struct cell *)malloc(sizeof(struct cell));
r->adj=v2; r->edge=i; r->next=adjlist[v1]; adjlist[v1]=r;
q=(struct cell *)malloc(sizeof(struct cell));
q->adj=v1; q->edge=i; q->next=adjlist[v2]; adjlist[v2]=q;
}
/*ここに取得したポインタを使ったダイクストラの計算が入ります.*/
free(r);
free(q);
return;
}
このようなコードになっています.
この関数を4回程度計算すると,メモリがいっぱいになってしまいます.
m=312の時は,300回以上繰り返し計算をすることができました.
やはり,mの値が大きく,負荷が大きいためでしょうか.
それとも,やはりメモリの開放がだめですか.
No.1
- 回答日時:
小さなサイズと大きなサイズのmallocを繰り返していて、mallocした順に解放していないとメモリ不足になる可能性はあります。
環境が書かれていませんが、Windowsやパソコン用のLinuxであると仮定すると通常はありえないと思いますが、マイコンであれば十分にありえます。
もし、WindowsやLinuxであればmallocしたまま不要になってもfreeし忘れているか、システム的に無理があるほどメモリを利用していると思われますのでメモリの利用の仕方を再設計したほうが良いでしょう。
マイコンであれば、自分でメモリ管理関数を作って小さいサイズのメモリ確保はmallocに頼らないほうが無難です。
自分でガベージコレクトという手もありますが、遅くなるのでお勧めしません。
zwi様
ご回答ありがとうございました.
windowsを使っていてfreeもできていると思うのですが,大きなメモリサイズを確保させようとしているのが負荷がかかっているようです.
今はコマンドプロンプトからfor /L %d in (0,1,9999) %d do AAA.exeの文を使っています.
計算を細分化して繰り返し行い,システムに負荷がかからないようにしてみました.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- その他(パソコン・周辺機器) タブレットで使用するUSBメモリについて 7 2022/05/26 14:27
- CPU・メモリ・マザーボード 【PCメモリ増設】メーカーによって相性は違うのでしょうか? 9 2023/08/25 21:37
- ドライブ・ストレージ 最近は従来のUSBメモリと同じ様な外観のSSDが出てますよね。 これってPC等のバックアップ用に使え 8 2023/01/05 12:45
- デスクトップパソコン メモリ増設をしたところPCの動作がおかしくなりました。 9 2023/03/13 21:16
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- その他(プログラミング・Web制作) 機械語に詳しい方 2 2022/07/10 12:06
- au(KDDI) 特定の画面を見るとスマホが固まります ご覧頂き有難うございます。 特定のページを見るとスマホが固まり 1 2023/08/21 19:29
- CPU・メモリ・マザーボード メモリーを増設し、8G*2枚から、追加で16G*2枚を挿したら、パソコンが起動しなくなりました 11 2023/04/23 14:41
- CPU・メモリ・マザーボード ゲーミングpcのファンのことについて教えて欲しいです。 6 2023/03/05 07:44
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
プログラムが途中で強制終了し...
-
allocってなんですか?
-
DLLで同じメモリ領域を参照する...
-
行数の変動にも対応したファイ...
-
書き換え
-
OpenCV cvLoadImageについて
-
win32APIのHeapAlloc()の使い方...
-
Win32APIでのメモリ管理について
-
C++のnewで確保したメモリーの...
-
ヒープメモリの解放について
-
アンマネージド関数でのメモリ...
-
free関数で動作が止まる
-
構造体配列の初期化について
-
newしないオブジェクトについて
-
VB.netでのwin32api呼び出し
-
mallocでメモリーを確保しよう...
-
16進ダンプのプログラム
-
malloc呼び出し時のセグメンテ...
-
mallocによる確保外の領域への参照
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
allocってなんですか?
-
C++のnewで確保したメモリーの...
-
newしないオブジェクトについて
-
c言語のポインタへの文字列入力...
-
プログラムが途中で強制終了し...
-
Win32APIでのメモリ管理について
-
グローバル変数のサイズ
-
ヒープメモリの解放について
-
stringの最大サイズ
-
Accessで、メモリを開放するタ...
-
入れ子になった構造体について
-
void*型のデータサイズ
-
DLLで同じメモリ領域を参照する...
-
callocの処理速度
-
mallocで確保するメモリの領域...
-
ビットをローテートするプログ...
-
DLLのマルチスレッドの動作につ...
-
C++で、メンバもヒープに確保さ...
-
LoadLibraryでAccess Violation...
-
配列の添え字の最大数とは?
おすすめ情報