mallocの後にfree不要と言うバカいるの?Part2
■ このスレッドは過去ログ倉庫に格納されています
fjの時代から10年以上に渡るmalloc/free問題について語ってください(^q^)
前スレ
main以外★mallocの後にfree不要と言うバカいるの?
http://toro.2ch.net/test/read.cgi/tech/1352812333/ >>561
ラッパ一つを「いろんな」「駆使して」とかいうお子様レベルなの?
あと GC はまだまだだよ、Java の業務アプリを60日間起動しているとメモリ占有量が増えてきてきびきび動かなくなるとか勘弁してほしい、スマフォもイマイチだなあ ほら出た、「俺様のやってる業務には」というすごく狭い世界が、世界の全てだ、みたいな人w >>559
確かにFORTRAN, COBOL と並ぶ由緒正しき Lisp 様由来の GC に喧嘩を売るのはちょっと怖いが、実はすでに試みてみた‥
http://peace.2ch.net/test/read.cgi/tech/1408017352/201 Qzって、Lisp Schemeでケンカ吹っかけてガン無視されてるよな。 >>547
演算子 new をオーバーロードするとき、中身は malloc() で書かざるを得ない気がする‥ >>572
VirtualAllocとかOS依存のメソッド使ったり、グローバルな配列を細切れに使ったりも出来るんじゃない?
標準のAPIで書くならmallocしかないけど…
コンパイラ環境側が提供するnewを標準Cの範囲のみで書かなきゃダメな規則とか有るんだろうか?
だけどstd::threadとか標準Cにはどうやっても落とし込めないよなぁ… いやいや、freeが邪魔になるのは数少ない例外って
世界でものすごく広く使われているプログラムcpがfreeが邪魔だから
最後のfreeしなくなったでしょ
Google word2vecだって最後のfreeは省略している。
上で書いてあるJaneの例はfreeすべき例、
オブジェクトの寿命が終わったのだから。
free絶対主義者の考え方の何が、気に食わないかって
オブジェクトの寿命を意識してプログラムを組んでいないんじゃ
ないかってこと。
リークチェッカに引っかからなければプログラムの実行中
不必要なオブジェクトの領域が確保されていても気にしなさそう。 なぜメモリを静的にではなく動的に確保するのか?の本来の目的を考えれば
自ずと答えは出る オブジェクトの寿命を意識するってのは、プログラム開始してから終了するまでの
どの期間存在するかを常に意識しろということなのかね。
プログラムの構造化によって生存区間を限定し、不要になった時点で破棄することで
大域的な知識によらずに安全に使用リソースの最小化を図るという考え方が理解できない
原始時代の人なんだろうか。
そういう人は少なくとも関数内でmalloc/freeを使うべきじゃないな。 大域的な知識を基に最適化するのはむしろ今のトレンドだけど
オブジェクトの生存期間を意識し、場合によってはfreeしないことで
プログラムの性能を向上させる話でしょ?
cpやword2vecの例は 自動化ないしは意識せずにできるようにするのはな。
プログラマ自身がしこしこやるのがいったいどこのトレンドだよw cpやword2vecを書くようなプログラマと
その辺で業務システム書いてるドカタを
同じ土俵で論じるのが間違い >>576
>> 不要になった時点で破棄
まさしくそれ、
不要になったと判明した時点で速やかに破棄というのが大前提。
free絶対派はその意識が乏しいんじゃないかと。
なんとなくmallocとfreeは対でなければいけないから漫然と
freeしているだけなんじゃないかと。
上記のJaneの例なら
画像を破棄したらその画像で使用した領域はその時点でfree
スレッドを破棄したら、それに使った領域はその時点でfree
word2vecは入力した文書の統計情報は最後まで利用する
--> 破棄されることがないので、freeする必要がない それ「最後まで利用」じゃなくて、利用終了時点の判断をネグってるだけ。 プロセスが確保したメモリは、プロセスを終了させても解放されず、
解放するにはコンピュータの再起動が必要となるOSが昔あったなあ。
バグではなく、OSの正規の仕様として。OSの名前忘れたけど。
そんな仕様じゃメモリをいくら積んでも足りないし、連続稼動できないじゃん!
・・・という各方面からの否定的な評価に対し、そのOSの設計者は
「メモリを十分に積まないのが問題」「定期的にリブートすればいいこと」
「メモリ資源の再利用をOSに任せようとするアプリケーション開発者の手抜き」
のようにOS側の問題ではないと一蹴してて、その主張に一理あるということで、
当時はちょっと衝撃を受けたわ。
malloc したものを free することには合理性があるけど。
その価値観に対抗するようなOS設計哲学も存在するということで。
何が正しいのか、唯一の結論を出すのは、なかなか難しいかもねえ(^o^)ノ UnixのSIGKILLみたいに問答無用でプロセスが殺されたりせずに、後始末の作業が
できることがシステム全体として保証されてるなら通る理屈だけど、どうせそのような
仕掛けがあるわけじゃないだろうなw >>581
だからさぁ・・・それをfree不要とは言わないでしょ。
freeしない領域も実質プログラムの終了でfreeを代用してるだけだし、
プログラマの意図としてはfreeすべき場所を把握できているケース。
このスレはfreeも満足に使えないくせにfree不要とか言っちゃう馬鹿を断罪するスレなんだよ。
なんでそこまでして「free不要論は間違い」をfree必須教みたいに扱って敵視してんの?
発端のfree不要とか言っちゃった馬鹿が知恵つけながら粘ってるようでヤなんだけど。
>>584
そこまで行くとkillするAPIも無いとかkillする側が責任持つべきとかになるんじゃね。 プログラムの最初から最後まで領域を優先するようなメモリはStatic使うべし。
MallocはFreeされるべき。 途中でfreeしてメモリを効率よく使えるようmallocするんじゃないんかと… Malloc自体は遅いんだよ。
Freeしなかったら蓄積してって確保できなくなるぞ。
まぁ、最近のコンピュータで困るかはわからん。 GCを前提としたmallocだと、極端な奴ではポインタずらして管理情報をちょこっと書くだけ、
って場合もあるけどなw mallocしたメモリをGCしてくれるわけねーだろw
そういうやつはC++ならせめてgcnewくらい使え これが fopen() / fclose()、低水準なら open()/close() の話だったりすると、
プロセス終了時にオープンされているものは OS がクローズしてくれるものにもかかわらず、
「プログラム終了時の fclose() を省略しないやつは糞」というのはあまりきかないね…
ま 10万20万と fopen() するわけではないからね… つーか、終了時のメモリ開放処理程度をめんどくさいとか言うやつは
もうプログラマなんか向いてねーからやめちまえよ >>593
プログラマがめんどくさいだけならいいけど、
ユーザーが遅さを体感することになるからな
ユーザビリティの観点からもプロセス終了時の明示的メモリ解放はやめるべきだ >>592
「俺はmallocとfreeを使える」って所で学習が止まってしまっていて、そこまで到達したことだけが
心の支え、というオワコンプログラマが多いのさ。 最近のシステムではないと思うけど、ファイルの場合は排他ロックしたらシェルから見てデッドロックしたりするので解放しないという選択肢はないはず。 昔はOSの設計上、同時に開けるファイルハンドル数に厳しい制限があった
今はほぼ制限なしに等しくプロセス外にまで支障をきたすほどたくさんファイルを開くシステムも稀
プロセス間で同じファイルを扱うケースも実際には少ない たしかに MS-DOS でも1プロセス20までだったか、プロセスメモリマップにもそういうテーブルがあったね >>595
たしかに、きっちり malloc() と free() を対応させる技術がなく、当然必要がなくなった時点でさっさと free() することもできない、したがって free() しなくともよい判断は到底不可能という、頭の可哀相な >>558 もいることだし ファイルロックの方法によるのにあっさり決めつけてしまってるあたりが、
全くわかってないことを露呈していて趣き深い。 ちょっとしたgcぐらい、自分で作れよ
gcnew?知るかそんなの >>602
こまめにmallocしまくって自滅フラグw 我々はすべての主記憶を解放するまで戦い続ける。
解放すると遅い。
それは設計あるいは使用範囲が間違っているのである。
適宜開放することにより、誤りに気付く機会が与えられる。
すなわち、確保した記憶域は必ず解放されねばならない。
(主記憶解放戦線憲章より引用) >>603
こまめに free() することにどんな自滅パターンがあるというのか?お前も頭の可哀相な >>558 の同類か? >>593
終了時の開放は別に無くても良いと思う。
勿論反復ルーチンでは都度開放しないといずれ枯渇するから開放は当然。
GC無くても如何なる場合も開放不要、みたいな意見には賛成できない。
要はケースバイケース >>607
貴様は己の能力を過信しすぎている。
必ず解放しろ。
いいな、これは命令だ。 計算指示書作成手順において、記憶域解放が省略されてはならない。
それは省略ではなく手抜きである。
少々の手抜きが計算指示全体に悪影響を及ぼすことがある。
心して作成せよ。 サッカースタジアムは、
客がはけた後には必ず掃除されるんだから、
サポーターがゴミ拾いをする必要はない。 しかし同じ日に繰り返し何試合もやったら次第に人のいる場所がなくなるだろ >>ID:i9BKJ0vK
はっはー。サタンサマー。 組込ソフトウェアでfreeしなかったら、起動してネットワーク接続したら3分と持たずにフリーズするかメモリ枯渇エラーのログ吐きまくるわ 俺の知っている、という枕詞が省略されている典型例やな free要る派
→自分でしたうんこは自分で流す派
free要らない派
→うんこしたけど、この便所二度と来ることないから俺シラネ
便所の管理人が勝手に掃除してくれるんじゃね?
と考えると、俺は断然free要る派となる >>616
流すまでその便所は他の人が使えないわけだが、管理人が来ないまま使える空き便所が無尽蔵にあるという前提が必要だな それが無尽蔵にないからswap地獄に陥るんじゃないか。 管理人がやって来る明確な規則がイマイチわからなくて気持ち悪い >>553
>信者信者言うのは
自称だと思うよ
絶対というわけではなく細かい点で要不要が議論されることはあるからね けっこう最近(?)の話なんだ‥面子的に1990年〜1995年くらいかと思っていた >>624
Qちゃんfjに参加してたの?
QちゃんC/C++宿題スレで勉強始めたような28才くらいの若者かと思ってたけど(煽り抜き)
意外と古くからML読んでたりしてたの?
おどろき >>625
>C/C++宿題スレで勉強始めたような
この部分は当たり他ははずれ
もう7, 8年くらいにはなるな‥
成長が遅いのは頭が悪いせいから仕方がない 15年経っても同じような屁理屈をこねる者がいるというのは感慨深い malloc()してfree()しない奴とかなんなの?
exeが終了すればOSがヒープ領域も解放してくれるからfree()不要とかなんなの?
内部で何度もmalloc()するアプリだと、free()しないと、ユーザーが定期的にアプリを
再起動しないとどんどんメモリが食われていく
そんなクソアプリを作る奴はいらね
だからfree()しとけカスども malloc()してfree()しないなら、素直に配列を使えばいいのに・・・ これはGCやスマートポインタに対する警告文だろね。 安全側に振って思考停止する奴がCなんか使うんじゃねぇ
という主張なら理解できなくもない グローバルスコープの配列で出来ないことは動的確保だけだけど
free()でメモリ節約の意図がないならば
プログラム仕様上の最大容量でグローバルスコープ配列確保で全て済むよ データ量が多くてスワップするほどメモリを使ってしまうのと、僅かなデータの為にスワップするほどメモリを確保するのでは話が違うけどね。 何々全部配列でするの?
オブジェクトをnewしてポインタで管理したりしないの?
HSPみたいだね void hoge(){
・・・
p=malloc(10);
・・・pにゃむにゃむ、freeはしない
}
void main(){
hoge();
}
なんてのは
type p[10];
void hoge(){
・・・pにゃむにゃむ
}
void main(){
hoge();
}
こっちのほうがいいよ
freeやdeleteをちゃんと使わないコードがダメなだけだよ
スマートポインタを作りたいんなら
template<typename T>class A{
T* m_p;
A(int n){m_p=new T[n];}
~A(){if(m_p){delete[] m_p;m_p=null;}}
・・・にゃむにゃむ
}
コンパイル通してないからあれだけどこんなかんじに
コンストラクタとデストラクタをやっとけよ #include <iostream>
using namespace std;
#define TEST
template<typename T>class A {
public:
T* m_p;
int m_size;
A() {
m_p = nullptr;
m_size = 0;
#ifdef TEST
cout << "コンストラクタ A"<<endl;
#endif
}
A(int n) :A() { m_p = new T[n]; m_size = n; }
~A() {
if (m_p != nullptr) { delete[] m_p; m_p = nullptr; m_size = 0; }
#ifdef TEST
cout << "デストラクタ A" << endl;
#endif
}
}; void dispAint(A<int> &a) {
int i;
for (i = 0; i < a.m_size; i++) cout << a.m_p[i] << endl;
}
void main() {
int i;
{ A<int> a(10);
for (i = 0; i < a.m_size; i++) a.m_p[i] = i + 10;
dispAint(a); }
i = 1;//ブレークポイント設定
return;
}
delete使わないのがダメなだけだよ
スマートポインタを作りたいならこう書く void A::resize(int n) {
int i;
int m = (n < m_size ? n : m_size);
T* tmp=new T[n];
for (i = 0; i < m; i++) tmp[i] = m_p[i];
delete[] m_p;
m_p = tmp;
m_size = n;
}
クラスAのリサイズをするんならこんな感じ これのどこがスマートポインタwww
バカ決定じゃねーか ああ、こうだった
void A::resize(int n) {
int i;
int m = (n < m_size ? n : m_size);
T* tmp=new T[n];
if (m_p != nullptr) {
for (i = 0; i < m; i++) tmp[i] = m_p[i];
delete[] m_p;
}
m_p = tmp;
m_size = n;
} >>641
どこが?って、そのまんまだよ
{ A<int> a(10);
for (i = 0; i < a.m_size; i++) a.m_p[i] = i + 10;
resize(5);
dispAint(a); }
メモリの確保と破棄をこのスコープで自動的にやるよ
利用は参照渡しじゃないとデストラクタが複数回呼ばれちゃうけどな ミス
{ A<int> a(10);
for (i = 0; i < a.m_size; i++) a.m_p[i] = i + 10;
a.resize(5);
dispAint(a); } だからそれのどこがスマートポインタなの?
まだ気づかないの?本物のバカだ 所有権エラーが嫌ならthisポインタを保存すればいいだけのこと
ポインタとしての構文動作がしたいなら->()なり、*()なり
オペレータオーバーロードすりゃあいいだろ
#include <iostream>
using namespace std;
#define TEST
template<typename T>class A {
public:
T* m_p;
A* m_owner;
int m_size;
A() {
m_owner = this;
m_p = nullptr;
m_size = 0;
#ifdef TEST
cout << "コンストラクタ A"<<endl;
#endif
}
A(int n) :A() { m_p = new T[n]; m_size = n; }
~A() {
if (m_owner == this && m_p != nullptr) {
delete[] m_p; m_p = nullptr; m_size = 0;
#ifdef TEST
cout << "デストラクタ A" << endl;
#endif
}
}
つづき つづき
void resize(int n) {
int i;
int m = (n < m_size ? n : m_size);
T* tmp=new T[n];
if (m_owner == this && m_p != nullptr) {
for (i = 0; i < m; i++) tmp[i] = m_p[i];
delete[] m_p;
}
m_p = tmp;
m_size = n;
}
};
void dispAint(A<int> a) {
int i;
for (i = 0; i < a.m_size; i++) cout << a.m_p[i] << endl;
}
void main() {
int i;
{
A<int> a(10);
for (i = 0; i < a.m_size; i++) a.m_p[i] = i + 10;
a.resize(5);
dispAint(a);
}
i = 1;//ブレークポイント設定
return;
} ポインタとしての構文動作がしたいなら->()なり、*()なり
オペレーターオーバーロードすりゃあいいだろ ttp://nas6.main.jp/sptr.cpp
スマートポインタで実装したい動作で↑で足りないものはないとおもう あとはoperator ->(???)の定義の仕方がよくわからん ここまで指摘してあげているのに、
何でスマートポインタで検索して調べないの?
だから君はダメなんだよ
君の書いてるのは、コンテナ、で、スマートポインタ、ではない
はい、答え
バカは黙ってstd::vector使っとけ auto_ptr
scoped_ptr
shared_ptr
weak_ptr ttp://nas6.main.jp/sptr.cpp
コンストラクタが気に入らないみたいだから、よりポインタに近くしたぞ ひでえなあ…値全部コピーしてるだけで全然ポインタじゃない
しかも所有権管理全然できてないから、
コピーコンストラクタで渡すと移動せず不正アクセス
まだauto_ptrのがマシ >>654
俺が一番多用する unique_ptr 忘れてるぞ ttp://nas6.main.jp/sptr.cpp
メイン.cpp
ttp://nas6.main.jp/NAS6_smt_ptr.h
クラス.h
テンプレートが分割コンパイルできなくて四苦八苦した 相変わらず、コンテナとスマポの概念がごっちゃになってる
ゴミだな スマートポインタは標準ライブラリので間に合ってるから、テンプレートベースのツリー
コレクション作ってよ。 ttp://nas6.main.jp/sptr.cpp
メイン.cpp
ttp://nas6.main.jp/NAS6_smt_ptr.h
スマートポインタ.h
ttp://nas6.main.jp/NAS6_tree_clct.h
ツリーコレクション.h ttp://nas6.main.jp/sptr.cpp
メイン.cpp
ttp://nas6.main.jp/NAS6_cntn_ptr.h
コンテナポインタ.h
ttp://nas6.main.jp/NAS6_tree_clct.h
ツリーコレクション.h
コンテナポインタに改名した NASさんは物理板で意味不明な投稿連投してたからいいや ttp://nas6.main.jp/secret/ContainerPtr.htm
コンテナポインタ説明ページ ttp://nas6.main.jp/secret/ContainerPtr.htm
コンテナポインタ説明ページ
メモリリークを退治した^^ 匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています
言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?
Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al
ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw
The Covenant Project
概要
Covenantは、純粋P2Pのファイル共有ソフトです
目的
インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します
特徴
Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)
接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
x ■ このスレッドは過去ログ倉庫に格納されています