- mallocの後にfree不要と言うバカいるの?Part2
441 :デフォルトの名無しさん[sage]:2014/10/13(月) 17:57:02.26 ID:XfBY1GST - このスレまだあったんだ。
おっさん感激 !! ところで、Free必須論者は 本質的に寿命がプログラムの寿命と同じオブジェクトが あるということは認識してくれているのかな。 例えばさっきのcpのハッシュテーブルだったり、 コンパイラの構文木だったり これらのオブジェクトが必要なくなるとき=プログラムが終了するとき なんだけど、こんなかんじでfreeして開放された領域が2度と使われないことが 保障されているオブジェクトが存在するということは認識してくれている ?
|
- mallocの後にfree不要と言うバカいるの?Part2
446 :441[sage]:2014/10/13(月) 18:24:11.09 ID:XfBY1GST - >>442
それなんで、cpのハッシュテーブルっていう実例が出てうれしいです^ ~ 自分の経験で出せる例だと、 連立一次方程式を解くときの疎行列なんかぐらいになっちゃいます。
|
- mallocの後にfree不要と言うバカいるの?Part2
448 :441[sage]:2014/10/13(月) 18:32:16.15 ID:XfBY1GST - >>443
オブジェクトの寿命 = プログラム(プロセス)の寿命 なオブジェクトが存在し、それはfreeをしても確保したメモリ領域が 再利用されることはない。 というのはご理解いただいているのですね。
|
- mallocの後にfree不要と言うバカいるの?Part2
459 :448[sage]:2014/10/13(月) 19:19:27.66 ID:XfBY1GST - >>454
認識が確認できて幸いです。 わざわざそんなケースと言われるけど、 このようなケースは結構多いと思うんですよ。 普段使ってるgccもたぶんそうだし、 cpだってそう。 本質的に記憶領域の再利用がされないfreeをするために 循環参照があるリンクトリストを再帰で開放してまわったり freeをするための1万回のループをわざわざ書くというのは なんというか、知的ではないのではないかと もちろん、ライブラリ化するために、解放処理を記述するのは 必要ですけど、例えばgccの構文木を保持するコードは gcc以外に使えるとは思えないなぁ。 だから、専用に作ったんでしょ
|
- mallocの後にfree不要と言うバカいるの?Part2
462 :デフォルトの名無しさん[sage]:2014/10/13(月) 19:32:32.92 ID:XfBY1GST - >>456
その解法がメモリープールというのは、 ハッシュテーブルの領域全体をmallocでとって来て 中身を自前のメモリ管理コードで管理して、 解放するときは全体をfree一発で解放ってことでしょうか ? malloc-freeはsbrkやmmapで確保した領域を 管理するメモリプールだと考えられます。 ですので、再利用する見込みのない領域をわざわざfreeする必要は ないんじゃないのって考え方は、 上記の大きな記憶領域を確保して、解放はfree一発というものと 同一になります。
|
- mallocの後にfree不要と言うバカいるの?Part2
472 :458[sage]:2014/10/13(月) 20:39:23.78 ID:XfBY1GST - >>467
わかりにくい書き方ですみません。 前半の部分は http://www.slideshare.net/iwiwi/ss-11008471 の3ページの交通ネットワークを表すために 31ページみたいなグラフを作って、その解放コードを ちまちま、解放することを考えています。 後半は、行列なんかを使った後に for(i = 0; i < ROW_MAX; i++) { free(row[i]); } free(row); exit(0); なんてことをやることを想定しています。
|
- mallocの後にfree不要と言うバカいるの?Part2
481 :472[sage]:2014/10/13(月) 21:54:16.26 ID:XfBY1GST - >>477
> 前者は、参照の所有権をちゃんと考えないで複雑なデータ構造を作っちゃうと > いざ壊そうと思ったときに嵌ったりバグったりする典型だね。 ですので、freeせずにOSの持つメモリ管理機構を利用して exitですね。 freeするためにプログラムを作っているのではなく データを扱うためにプログラムを作っているのですから。 メモリリークチェッカを使わなければならないとかで、絶対freeしろって 言われたらmyMallocとmyFreeを作って、全体をmallocして最後に 一発freeってやりたいです。 > 後者は、使い捨てのやっつけプログラムとかじゃなければ普通こんなコードが > exit()の直前に置かれることはないと思うし、そうであれば普通に破棄処理として > 書くと思うんだけどなぁ。それを「わざわざ」と思うのはまぁ、個人の感覚かも知れんが。 なにをもってやっつけのプログラムと言うかはさており、 cpは実際にexitの前にforgetAllって終了処理が word2vec http://word2vec.googlecode.com/svn/trunk/word2vec.c ではvocab, vocab_hash, expTableは解放するならmainからのreturn 直前に記述することになりますね。 > #あぁ、rowもグローバル変数だったりするのかね? あくまで、例のための例ですが、グローバルなときもあります。 # というか、そのほうがすっきりする。
|