トップページ > プログラム > 2014年10月13日 > XfBY1GST

書き込み順位&時間帯一覧

9 位/249 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000000012211007



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
441
448
458
472
mallocの後にfree不要と言うバカいるの?Part2

書き込みレス一覧

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もグローバル変数だったりするのかね?

あくまで、例のための例ですが、グローバルなときもあります。
# というか、そのほうがすっきりする。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。