2016-11-10 20 views
-1

私のプロセスの現在のメモリ使用量を得るために、(WIN32 APIを使用して)C++関数を実装したいと思います。メモリ使用量を確認する方法

この投稿How to determine CPU and memory consumption from inside a process?からコードをチェックし、その機能を実装しました。しかし

bool GetMemoryUsage(size_t& usageInBytes) 
{ 
    PROCESS_MEMORY_COUNTERS_EX pmc; 
    if (GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*) &pmc, sizeof(pmc))) 
    { 
     usageInBytes = pmc.WorkingSetSize; 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

、私はそのようにそれをテストしようとすると:それが失敗した

size_t initialMemoryUsage = 0; 
GetMemoryUsage(initialMemoryUsage); 

size_t use = 596; 
void* memUsed = malloc(use); 

size_t memoryUsage = 0; 
GetMemoryUsage(memoryUsage); 
assert(memoryUsage == initialMemoryUsage + 596); 

free(memUsed); 

GetMemoryUsage(memoryUsage); 
assert(memoryUsage == initialMemoryUsage); 

:、GetMemoryUsagepmc.WorkingSetSizeを使用しています

  • 場合memoryUsageが12288によってinitialMemoryUsageよりも大きく、解放メモリがありませんそれを減らさないでください
  • GetMemoryUsagepmc.PrivateUsagememoryUsageinitialMemoryUsageは、私はパス上記のテストを持って正確で信頼性の高い方法で、いくつかのメモリ
どのように実装することができ

GetMemoryUsageを割り当てられた後でも、全て等しいですか?

+1

プロセスがメモリをどのように使用するかについてのあなたの期待は、単に間違っています。あなたが得た結果は正しいものであり、実際に何が起こっているかを示します。 –

+0

OK、そういうわけで、あるメモリがいつ割り当てられたのかを知る方法はありますか?それとも単純に不可能なのでしょうか? – jpo38

+1

「メモリ」と「割り当てられた」とは何を意味しているのかによって異なります。あなたは現在、いつメモリが割り当てられているか、どれくらい見ていますか?あなたが思うほどの記憶ではありません。 (物理?バーチャル、リザーブド、居住者、または何?)それはあなたの考え方に「配分」されていません。 (予約されていますか?有益なデータを含んでいますか?何ですか?)あなたがしようとしていることを正確に知らなければ、それを手助けするのは難しいです。あなたは何の質問に答えようとしていますか?できるだけ具体的にしてください。 –

答えて

0

実際には、特定の関数呼び出しでメモリリークが発生しないことを実行時にチェックします。私は関数によって割り当てられたメモリが解放されたことを確認したい。だから、ある時点で、新しい/ mallocによって割り当てられたメモリの数とまだリリースされていないメモリの数を知る必要があります。

申し訳ありませんが、それだけでは機能しません。

std::string foo() 
{ 
    return "hello"; 
} 

この関数が返されると、それ以前に存在しなかった新しいstd::stringが存在する可能性があります。それは漏れを示すものではありません。

ソフトウェアの仕組みではなく、ソフトウェアの仕組みについての期待があります。

プログラマーがメモリリークをどのようにデバッグするのかを見ると、より効果的だと思います。問題を解決するための助けを求めるときに人々が作るよくある間違いは、問題を解決すべきだと思うように思いついて、働くための助けを求めることです。それはあなたがやっていることです。

代わりに、実際の問題をできるだけ詳細に記述して、専門家にどのように解決するべきかを提案するよう依頼してください。彼らはもっとうまくいく方法を提案する可能性が高いです。

+0

大丈夫です。ここに私の問題の説明があります。 VLDを使用して、システムの重要な機能でメモリリークを検出し修正しました。今後、新しいリークを導入する開発者がいないことを確認するために、システムテストスイートに新しい単体テストを追加して、関数を呼び出し、ヒープの使用量が呼び出しによって増加していないことを確認します。テストシステムはVLDを統合せず、リリースモードでテストを実行するため、MicrosoftのヒープCRTチェッカーを使用することはできません。だから私は、ある時点でヒープの使用状況をチェックする関数を持っていたいと思います。 – jpo38

+0

より多くの情報を入手するには、別の質問をすることをおすすめします。しかし、私はあなたの環境に変更を加えることなくそれをするのは簡単だとは思わない。これを検出するツールとツールをすべて無効にすることを選択しました。ヒープのリリースバージョンは、コストがかかるため、この情報を正確に保持しません。おそらく、誰かが方法を知っているかもしれません - おそらく、あなたがリリースビルドにリンクすることができる計装ヒープ? –

+0

ところで、良い答えは私が 'malloc(596)'を行った後に 'pmc.WorkingSetSize'が12288だけ増えた理由を私に説明するでしょう... ;-) – jpo38

関連する問題