アカウント名:
パスワード:
C だって「解放忘れ」なら同じ現象が起こるでしょー。
Java は free を呼ぶ替わりに使わなくなったポインタに逐一 null を入れろ、ってだけ。
C でこれと同じ状況は「解放忘れ」で簡単に起こる、というだけのことだろう。
> > Java は free を呼ぶ替わりに使わなくなったポインタに逐一 null を入れろ、ってだけ。 > これも、ガベージコレクタがオブジェクトを回収する際の「ヒント」を与えるために使われるテクニックであって、必ずしなければならない、というものではありません。 一般論ではもちろんそうだが、 メモリ不足でVMが落ちる、なんて状況では必須だろう (そうでなければGCが回収しているはずなんだから)。
あれってBoundsCheckerってゆーんですね。
isualC++のメモリリーク警告って静的になめて出すだけなんでしょうか?それとも動的に解析してくれる?
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
Stay hungry, Stay foolish. -- Steven Paul Jobs
Javaの必要性 (スコア:1)
僕はいまいちJavaの良さが分かりません。
誰かJavaのすばらしさを語ってもらえないでしょうか。
Re:Javaの必要性 (スコア:1)
Java Applet のことだったり、 JavaScript のことだったりする
ことがあるので、いっかい問い詰めてみたほうがいいです。
Re:Javaの必要性 (スコア:2, 参考になる)
JITの技術がありますが本質的な解決策では無いと思います。
しかもテキスト処理なんかはJITを使ってもAwkよりもPerlよりも遅い。
次に移植性です。
Write Once Run Anywareとか言っていますがはっきり言って実現されて無いと思います。
移植性 + 速度
で考えるとCの方が上だと思っています。
GCを利点として挙げる人がいますが、それも僕はどうかと思っています。
GCがあるためにむちゃくちゃなプログラムでもある程度動いてしまいます。
1時間ぐらいだったら動くけど長時間動かしているとVMが落ちることがありますし、その時のバ
Re:Javaの必要性 (スコア:2, 参考になる)
> GCがあるためにむちゃくちゃなプログラムでもある程度動いてしまいます。
> 1時間ぐらいだったら動くけど長時間動かしているとVMが落ちることがありますし、その時のバグを見つけるのが非常に大変です。
C だって「解放忘れ」なら同じ現象が起こるでしょー。
Java は free を呼ぶ替わりに使わなくなったポインタに逐一 null を入れろ、ってだけ。
むしろ、C では使われていないポインタに NULL 以外の値が
入っていることがあって、そっちの方が危ないと思うのだがどうか。
#ま、C だって boehm GC みたいなのがあるけどね。
# mishimaは本田透先生を熱烈に応援しています
Re:Javaの必要性 (スコア:2, 参考になる)
Cで動的に確保されたメモリブロックは、明示的に解放しない限り、(少なくとも)そのプロセスの生存中は回収されないのに対して、Javaの場合は、他から参照されなくなったオブジェクトは、ガベージコレクタによって自動的に回収されます。(そもそも、解放するという操作自体がない)
また、 これも、ガベージコレクタがオブジェクトを回収する際の「ヒント」を与えるために使われるテクニックであって、必ずしなければならない、というものではありません。(スコープを外れ、どこからも参照されていなければ、回収される)
# 「ポインタ」という用語も不適切かと。
(未確認ですが、ガベージコレクタの性能の向上で、そういったテクニックをする必要もなくなってきた、というような話もあるらしいです)
Re:Javaの必要性 (スコア:1)
> > C だって「解放忘れ」なら同じ現象が起こるでしょー。
> 少し違うと思います。
> Cで動的に確保されたメモリブロックは、明示的に解放しない限り、(少なくとも)そのプロセスの生存中は回収されないのに対して、Javaの場合は、他から参照されなくなったオブジェクトは、ガベージコレクタによって自動的に回収されます。(そもそも、解放するという操作自体がない)
?よく意味が分からん。
短時間では問題はないが、長時間動かすとVMが落ちるようなプログラム、
というのは明らかにメモリを食い潰しているのであって、
C でこれと同じ状況は「解放忘れ」で簡単に起こる、というだけのことだろう。
> > Java は free を呼ぶ替わりに使わなくなったポインタに逐一 null を入れろ、ってだけ。
> これも、ガベージコレクタがオブジェクトを回収する際の「ヒント」を与えるために使われるテクニックであって、必ずしなければならない、というものではありません。
一般論ではもちろんそうだが、
メモリ不足でVMが落ちる、なんて状況では必須だろう
(そうでなければGCが回収しているはずなんだから)。
#「ポインタ」は不適切だったな。すまん
# mishimaは本田透先生を熱烈に応援しています
Re:Javaの必要性 (スコア:1)
オブジェクト同士の意図しない循環参照などを断ち切る(その結果ガベージコレクタが回収できるようにする)ためにnullを代入すべきだということであれば同意します。
が、Cでfreeを呼ぶ代わりに、Javaではとにかくnullを代入すればよいという風に読めたので。それだと、Cのメモリ管理のやり方とJavaのやり方を混同されかねないと思いました。
結果的に同じことじゃないかといわれそうですが、解放が(プログラムの指示によって)能動的に行われるか、(VMの働きによって、プログラム側から見ると)受動的に行われるかという概念の違いは大きいのではないかと思います。
Re:Javaの必要性 (スコア:0)
vi使ってLinuxでCで書くんだったら確かにJava使ったほうがいいと思うけどね
おれはほとんどWindowsしか使わないからJavaの必
Re:Javaの必要性 (スコア:1)
という事でしょうか。
サーバー側のJavaが花開いたのは、バックエンドがころころ
変わるのに対応出来る、という事なのでは。
-----------------
#そんなワタシはOS/2ユーザー:-)
Re:Javaの必要性 (スコア:0)
> という事でしょうか。
> サーバー側のJavaが花開いたのは、バックエンドがころころ
> 変わるのに対応出来る、という事なのでは。
そーそー、Windows上でスタンドアロンなアプリを趣味で作る
人にJavaのありがたさは分かりっこないですな:-p
ま
どの機能についていっています? (スコア:1)
これってどの機能のことを指していますか?
VC6.0を日常業務に使っていますけど、VC がメモリの解放し忘れ
を指摘してくれたことなど皆無なのですけど、、、
あとデバッガがメモリリークを指摘する機能は 設計がよくでき
ていてちゃんとコーディングされたプログラムに対して行う場合は
有効だけど、いい加減な設計のプログラムに対しては無力だと
思います。
#「ほとんどメモリは使い捨て」の前提で書かれた20万行ぐらいの
#プログラムを NuMega の BoundsChecker に掛けたら数千箇所も
#問題を指摘されてことがある、、、
コンタミは発見の母
BoundsCheckerは、Visual C++とは別製品だよ (スコア:2, 参考になる)
BoundsCheckerは、元々米国のNumega社が開発し、米国Compuware社に買収されて、現在は「Compuware社のNumega製品」ということで販売されています。
私の知る限りでは、M$社にぴったりくっついていて、VC++などとの相性というか、一部のように機能する、ということを売りにしていますが、完全な別会社の別製品です!。
ご参考までに日本コンピュウェアの該当サイトをお知らせしておきます。
ここ [numegajapan.com]です。
この会社の営業やってる知り合いに教えてやろうかと思っちまったい!
それなんだけど・・・ (スコア:0)
Re:どの機能についていっています? (スコア:0)
IDEから実行してデバッグすると出る奴のことですよね。
>元コメントのAC氏
#_CrtSetDbgFlagとかそのあたり
あれは未初期化の変数やメモリ領域に特殊な値を入れて
おいて、freeした時にもその特殊な値を入れるようにして、
Re:どの機能についていっています? (スコア:0)
#include<afxwin.h>
#define new DEBUG_NEW
ってやっておいたらプログラム実行終了後に
リークしてるメモリをおしえてくれました。
デバッグモードのみの機能みたいですが。
このことでしょうか?
Re:それなんだけど・・・ (スコア:0)
#こういうタイプの人は、往々にして言語仕様と標準ライブラリと独自ライブラリの切り分けも出来てなかったり。
Re:それなんだけど・・・ (スコア:0)
BoundsCheckerなんて始めて聞いたし
BoundsCheckerって何?
Re:それなんだけど・・・ (スコア:0)
直訳直訳。
Re:どの機能についていっています? (スコア:1)
#63080 の人のメモリ解放のし忘れ検出の機能はこれみたいですね。
これは new して delete されていないものを表示するだけだから、
メモリリークをしている可能性のある箇所を大量表示しちゃうんで
すよね。
ないよりましだけど、本当にメモリリークを潰す必要があるプログラム
(終了のこないサーバープログラムや、プログラムの途中のフェーズ
で大量にメモリが必要になるプログラム)には 使えんです。
コンタミは発見の母
Re:それなんだけど・・・ (スコア:0)
言語仕様を VM に頼ってる部分(動的バインディングのやり方とか)とかあるし、
例えば awt の設計はライブラリ? 言語仕様?
Re:BoundsCheckerは、Visual C++とは別製品だよ (スコア:0)
(もしくは MS の製品になるはずだったけど消えた製品)
なんて腐るほどありますから、現在も別の会社の製品といっても
一緒に機能が提供されていれば知らない人がいるのも無理ないかと。
# あぁ私は一応知ってますが。
BoundsChecker (スコア:1)
ランタイムベースの非常に強力なエラー検出ツールです。
配列の境界を越えたアクセスをチェックしてくれるのが名前の
由来だと思います。
今はもう持っていないので詳細をチェックできませんが、メモリ
リークやリソースリーク、配列・構造体の境界チェック、ダング
リングポインタの検出ができたはずです。
似たようなツールに Rational 社の purify があります。
コンタミは発見の母
Re:どの機能についていっています? (スコア:0)
自分で裏を取ってから投稿するべきだったのでは?
たとえば、ここ [google.com]とかで。
# ちょっと調べれば分かることなのに
Re:BoundsChecker (スコア:0)
Re:BoundsCheckerは、Visual C++とは別製品だよ (スコア:0)
これだと、BoundsCheckerがVisual Studioにバンドルされているように読めます。
Visual StudioのIDE内でシームレスに使用できるから区別がつかな
Re:BoundsCheckerは、Visual C++とは別製品だよ (スコア:1)
ええと。VCのことは知りませんが、一般的にいえば
そういうのはプラグインという類のものであって、
わざわざ「完全な別会社の別製品」などと言うほどのことでもないと思うんですが。
プラグインならばどこの馬の骨にも作ることはできるので。
そして妥当なプラグインAPI(もし有るならば)に則って作ったプラグインは、
相性ピッタリでも全然変な(珍しい)話では、ないわけで。
一部のように機能するってのもプラグインならば当然のことですし。
#プログラムすなわちos上に直接乗るアプリケーション、だと思っていませんか?
その製品がどうなのかは知りませんが、たしかVCにもプラグインみたいな概念は
有るんじゃありませんでしたっけ?
#delphiにもjbuilderにも有るよね(^^;
え?windowsのプラグインのIE? うーん(^^;;
Re:Javaの必要性 (スコア:1)
前者だったら、ワタシはむしろプログラムする人がタコい気がしますし、後者だったらこれはチューリング賞クラスの偉大な機能な気がしますが、どっちなのでしょうか?
-----------------
#そんなワタシはOS/2ユーザー:-)
Re:Javaの必要性 (スコア:1)
ぐわ、VisulaC++のIDEが行う動的チェックってただのスタックチェックなのね。IDEが静的なソースから動的にフローを出してくれてそれでメモリリークを教えてくれるのかと思いましたよ。
pascalerとしてはまったく不要の機能だなぁ・・・
-----------------
#そんなワタシはOS/2ユーザー:-)