• 締切済み

メモリリーク

Windowsのサービスからプロセス起動をし、プロセスから_beginthreadでスレッドを作成し(マルチスレッド)、スレッドの中で30秒ごとにSNMPリクエストするようなプログラムを作成しましたが、不定期にメモリ使用量が増えています。 ソースコードをチェックしましたが、クローズ漏れはありません。 情報が少ないですが原因が分かる方がいれば、教えてください。 開発環境はWindows2000,VC6.0です。

みんなの回答

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 再現性があるのであれば、怪しい箇所をコメントアウト して、再確認すればソースコードを追うよりも 早く分かると思いますょ。 _beginthread から返されたハンドルは CloseHandle していますよね?

aers
質問者

お礼

怪しいところをコメントアウトして調査してみます。 _beginthreadから返されたハンドルをCloseHandleはしていません。 _beginthread時はCloseHandleはしてはいけないはずですが。(_endthreadの中でCloseHandleが呼ばれるから)

全文を見る
すると、全ての回答が全文表示されます。
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

メモリリークとは、確保した領域を解放せず 終了してしまった場合に発生するものです。 どのように変数や配列また、クリエイトしているものがあるのかわかりませんが、そういったものをちゃんと解放しているのか確認する必要があります。

aers
質問者

お礼

ありがとうございました。 解放漏れのチェックはツールを使用し、ソースコードを複数人でチェックしているため、可能性は低そうです。 もう少し調べてみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SNMPマネージャAPIでメモリリークしてしまう

    初めて投稿します。 ネットワークに接続したプリンタ4台を、SNMPを使って状態監視するソフトを作成しています。以下のソース(文字数制限のため、大半をコメントで記述しています)を実行すると、SnmpMgrRequest()関数内でメモリリークを起こします。 この関数の戻り値はエラーではありません。しかもプリンタ1台のみを監視するとメモリリークしません。この関数をコメント化しても起きません。 SNMPは始めてなので何が悪いのかよくわかりません。 どなたか何かご存知であればご教示お願いします。 開発環境はWindowsXP(SP1) VC++6 SP5を使用しています。 (ソースの拡張子は.cです。) void main(){ while(1){ for (i = 0 ; i < 4 ; i++) { mib=StsGet([プリンタのIPアドレス]); } Sleep(600); } } int StsGet(LPSTR adr) { //SnmpUtilMemAlloc ()でSNMPエージェントのアドレス取得 //SnmpUtilMemAlloc()でコミュニティ取得 //変数バインディングの初期化 //SnmpMgrStrToOid()でOIDを文字列から値に変換 //SnmpUtilMemReAlloc ()で変数バインディングにメモリを割当て //変数バインディングにOIDを追加 //SnmpMgrOpen ()でSNMPマネージャAPIのオープン(タイムアウト:100ms、リトライ:1回) // SnmpMgrRequest()でSNMPマネージャAPIに指定操作(Get)を要求 //SnmpUtilVarBindListFree(),SnmpUtilMemFree()で各変数を解放 //SnmpMgrClose()でSNMPマネージャAPIとの接続を終了 return [プリンタ状態;] }

  • メモリリークを調べています。

    メモリリークを調べています。 MFC(VC2005)です。 MFC拡張DLLで作成したアプリケーションにメモリリークがないかを調査し始めたのですが、VisualStudioでデバッグでは 「Detected memory leaks!」は出ません。 パフォーマンスモニタで、このDLLを静的リンクしたEXEのPrivateByteを約90時間監視すると、2回だけ大きな上昇(といっても数10KB)が見られました。 上昇するまでは横ばいですが、この横ばいの時間が2回とも異なります。 これはメモリリークと言えるのでしょうか? ちなみに、このDLLの調査対象機能は画像描画機能で、定期的にメモリ確保→メモリ解放を繰り返します。 メモリリークでないとしたら、どう結論付けたら良いでしょうか? 解決方法はありますか? 私としてはフラグメンテーションを疑っています。

  • _fcloseall

    マルチスレッドで_fcloseallを使うとほかのスレッドで開いているファイルまでクローズしてしまうのでしょうか? あるいは、別のプロセスでオープンしているファイルまでクローズしてしまうのでしょうか? 「開いているすべてのストリームを閉じます」とはどういうことなのでしょうか? よろしくお願い致します。

  • マルチスレッドプログラムでメモリが増加

    VS6.0 で マルチスレッドのDBアクセスプログラムを作成しています。 現在、スレッドを起動し、スレッド内でデータベースオブジェクトを宣言、オープン、クローズしているだけなのにメモリが増えつづけてしまっています。 宣言方法等、何か問題がありましたら指摘ください。 (ちなみにスレッドから起動されたスレッドです。) ◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎ void __cdecl XXXApp::XXXThread( void* arg ) { CDatabase m_DB; m_DB.OpenEx( 接続文字列, CDatabase::useCursorLib|CDatabase::noOdbcDialog ); if( m_DB.IsOpen() == TRUE ){ m_DB.Close(); } _endthread(); } ◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎ すいませんがアドバイスをお願いします。

  • プロセスとスレッドの違いについて(Cプログラミングの観点から)

    プロセスとスレッドの違いがしっくりきません。 <プロセス> (1)プログラムの実行単位。Windows や Linux などの汎用 OS 上のアプリケーションは一般にプロセスとして動作している。プロセスは1つ以上のスレッドと、ファイル、ヒープメモリなどのリソースで構成される (2)起動や切り替えのオーバーヘッドが大きい <スレッド> (1)同一プロセス内の複数スレッドを同一メモリ空間上で実行でき、メモリ消費量などが軽減できる。 (2)マルチスレッド処理のプログラミングにおいては、同じデータを複数のスレッドが同時に書き換えることによる不整合に注意し、排他制御を行う必要がある。 等はwiki等調べて理解しています。 何が疑問なのかと申し上げますと、具体的にプログラミングする際に (1)マルチプロセスとマルチスレッド方式では、ソースにどのような違いが出てくるか (2)マルチプロセスとマルチスレッド方式では実行時間がどれだけ変化するか がわからないのです。お仕事で並列処理等について担当されている方などおられましたら、お手数ですがご教授ください。 なお、わかりやすい書籍、webサイト等ありましたらそれも併せて教えていただけると助かります。よろしくお願いします。ちなみに、環境はWindowsXP,VisualC++ExpressEdition2005を使っていますので、UNIXよりはWindowsかつCで動くプログラム例で教えていただけると大変助かります。しかし、当方Javaも多少であれば組めますのでJavaでも構いません。 何卒、よろしくお願い致します。

  • .NET2003 C#でQRコード

    こんにちは。 私はQRコードを使った開発を行おうと思っているのですが、 QRコードを作成するためのフリーのソースコードってありますか? できれば.NET2003 VC#での開発を望んでいますが、なければVC+などの他の言語でも構いません。 よろしくお願いします。

  • メモリリークの件

    メモリリークについて教えてください。 最近VC++を勉強中なのですが、メモリリークというものを知り、_CrtDumpMemoryLeaks()をしたところ、以下のコメントが出力されました。 [コメント] Detected memory leaks! Dumping objects -> strcore.cpp(118) : {71} normal block at 0x00344978, 20 bytes long. Data: < cmd.> 01 00 00 00 07 00 00 00 07 00 00 00 63 6D 64 2E {48} client block at 0x003428E8, subtype 0, 64 bytes long. a CDynLinkLibrary object at $003428E8, 64 bytes long {43} client block at 0x00342720, subtype 0, 64 bytes long. a CDynLinkLibrary object at $00342720, 64 bytes long {41} client block at 0x003425D0, subtype 0, 64 bytes long. a CDynLinkLibrary object at $003425D0, 64 bytes long Object dump complete. スレッド 0x584 終了、終了コード 0 (0x0)。 上記のコメントから、メモリリークを起こしていることはわかりました。ただ、strcore.cppというクラスは作成していないのですが、エラーが出ます。 多分他の関数から呼ばれているクラスだと思うため、クラス等をコメントアウトして調べたのですが、エラーがまだ出力されます。 (Data: < cmd.> 01 00 00 00 07 00 00 00 07 00 00 00 63 6D 64 2Eここは自作クラス上の問題だと思います。) newとかの解放はしているのですが、他にメモリリークをする原因ってあるのでしょうか?

  • メモリリーク

    VC++ 2010 SP1 MFC使用環境です 現在i以下のサンプルソースをベースに改造しているのですが http://code.msdn.microsoft.com/windowsdesktop/DVD-RW-870205bd その中の関数内で以下の行があります BSTR path = ::SysAllocString(変数)); 改造に当たり関数内で変数の内容を変更させて 同様の処理を複数回行いたいと思っています ここで あれ?  と思ったのが ::SysFreeString(path); 実行してなくてリークしないのか? ということなんですが 試しに BSTR path = ::SysAllocString(変数)); を複数回実行してプログラムを終了してみましたが 出力Windowにはメモリリークは出ていないように感じます その判断が間違ってる可能性は否定できないので質問させていただきました 実際今回のような場合 SysFreeString 関数をコールする必要はないのでしょうか? 仮に今回は必要ないにしても関数自体が存在するということは必要性はあると思うのですが どういったときにコールする必要があるのでしょう

  • スレッドの意味

    マルチスレッドについて良い資料が見当たらず、教えて下さい。 OSにおけるマルチスレッドと言うと、同一プロセス内でメモリ空間を 共有して独立に動く一連の手続き、と捉えています。(シングルCPU シングルコアだとOSで時分割によって作られた仮想的な並列計算) Javaのようなマルチスレッドのプログラミング言語では「一つの プログラムから作られた二つの一連の手続き」と言うイメージが あります。※裏側の動作ではOSに依頼してJavaのプロセス内で OSのスレッドを生成して処理を渡しているだけ?と思っています。 CPUコアの内部で説明される「マルチスレッド」と言うのは、 どのようなレベルのスレッド(何が並列処理?何処まで並列?) なのでしょうか。

  • _beginthread でメインのキー操作に影響する

    VC++ V6.0 MFC OwnerDrawボタン ダイアローグベースアプリケーション Win98/Win2000 でCreateThread でスレッドを作成していました。 Thread は while で回し、キャプチャ画像を取り込んでます。 しかし、MFCでは CreateThread API はマズイということなので _beginthread 変更しました。 Win98 環境下でCreateThread の時は問題ありませんでした。 しかし、_beginthread に変更したところ、スレッド開始で砂時計でキー操作ができなくなりました。 作ったスレッドは GetThreadPriority は THREAD_PRIORITY_NORMAL と返ってきます。 そこでTHREAD_PRIORITY_BELOW_NORMALに変更したところ、CreateThread で作ったスレッドと同じレベルのキー操作ができるようになりました。 しかし、処理速度が低く困ってます。 while ループでは20msぐらいの仕事なので 30ms で回るよう経過時間を測って Sleep を入れてあります。 よろしくお願いします。