• ベストアンサー

APIを多用した場合のメモリー消費について

標準モジュール内でAPIを使用した関数を多数定義した場合、このプログラムを実行中はメモリーに常駐し、メモリーを消費(浪費)してしまうのでしょうか? それとも、その関数を呼び出した時のみロードされるのでしょうか? DLLという名前からして後者だと思うのですが。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • gungnir7
  • ベストアンサー率43% (1124/2579)
回答No.3

>APIを多用し過ぎて、リソース不足でアプリが動かないなんてこと・・・ APIはメモリにロードしているのですから、有り得ない話ではないですが、 それを心配するのは現実的ではありません。 そんな状態を招くには、何百、何千というDLLを動かす必要があるでしょう。 むしろオブジェクトやmallocなどで取得した領域の開放忘れによる リソース漏れの方がよほど深刻で現実的な問題です。 VBですと画像を扱う場合にコンパチブルなデバイスコンテキストを 作成する機会は多いかと思います。 こういう場面でリソース漏れ(GDIシステムリソース)が発生する 危険性は非常に高いといえます。 私はかつてあるクライアントの依頼でビューワを作成したことがあります。 1Gのメモリを積んでもらったので、設計上はDIBで5万枚の画像まで メモリに読み込めるはずでした。 参考書をみようみまねで表示する部分を作成したのですが、 200枚を過ぎた頃から激しく不安定になったのです。 それで色々調べたところ参考書に穴があって リソース漏れが発生したことが判明いたしました。 参考書は画像1枚だけを処理するものだったので露見しなかったのです。 しかし、この件は参考書は責められないと思いました。 露見しなければ気付かないなと私も思いましたから。 かようにWindowsにはリソース漏れの罠があちこちにあるのです。

MusaGoro
質問者

お礼

詳しい解説、ありがとうございます。 私が使用しているのAPIは精々10個程度ですので、心配なさそうです。 それよりオブジェクトお開放について、見直します。

その他の回答 (3)

  • ArukuMail
  • ベストアンサー率22% (115/510)
回答No.4

>>私の意図は正にその通りなのですが、VBで出来ないのですか。。。 >>APIを多用し過ぎて、リソース不足でアプリが動かないなんてことは起こり得るんでしょうか? これは使う、APIによります。 MSDNのマニュアルには、APIを使った後、後処理をしないと いけないと書いてあるものもあります それのとおりに行わないと、アプリケーション内でメモリーリークが発生します。 基本的に、マニュアルどおりにすればロースぺックのPCでも簡単に動作します。 ただし、VBに対応したAPIに限ります VBに対応しないAPIを使用すると突然意図しない終了をおこします。

MusaGoro
質問者

お礼

趣味で個人で使うアプリを作っているだけなので、APIは解説書の内容を見よう見真似で使っており、MSDNのマニュアルなど、ほとんど読んだことがありません。 きちんと勉強します。 ありがとうございました。

  • gungnir7
  • ベストアンサー率43% (1124/2579)
回答No.2

両方の意味が可能なのですが、 質問をVBのカテゴリにしてきたことを考慮して それに的を絞って回答すると前者ということになります。 後者の意図していることは、 おそらく不必要になったらメモリから解放するということだと思いますが、 こういう芸当は明示的リンクといってVBではできないと聞いています。 Cで明示的リンクはLoadLibrary関数で呼び出し、ポインタで参照します。 世の中に多く出ているプラグインと呼ばれる類のDLLは こういう仕組みがないと活用できません。 前者はメモリに常駐し続けますが、 既に他のアプリ(例えばワード)とかも同じDLLを使っていると、 そちらのDLLを拝借しにいくようになっています。 だから同じAPI(DLL)が複数のアプリで使われている場合は、 メモリの節約になるわけです。

MusaGoro
質問者

お礼

回答ありがとうございます。 > おそらく不必要になったらメモリから解放するということだと思いますが、 > こういう芸当は明示的リンクといってVBではできないと聞いています。 私の意図は正にその通りなのですが、VBで出来ないのですか。。。 APIを多用し過ぎて、リソース不足でアプリが動かないなんてことは起こり得るんでしょうか?

  • ArukuMail
  • ベストアンサー率22% (115/510)
回答No.1

>>このプログラムを実行中はメモリーに常駐し、 >>メモリーを消費(浪費)してしまうのでしょうか? 基本的に、ブログラムはステップ毎の処理になるので 該当のAPIが実行されてはじめて実際のメモリー消費がなされます しかし、定義自体先に全部すんでいるわけですから 予約されているメモリーは多くなります。 (この辺は、動的にDLLをリンクしないCと同じです。) つまり見た目、メモリー消費は多いです

MusaGoro
質問者

お礼

早々にご回答、ありがとうございます。 「見た目」の意味がいま一つ理解できませんが、とにかくAPIは使った分だけ、消費量は増えるということですね。

関連するQ&A