在Windows下查找程序在c中使用的总内存

时间:2012-01-20 00:31:35

标签: c memory

我在c

中有一个小程序
#include <stdio.h>
#include <string.h>
#define SIZE 30

int main()
{
  char name[ SIZE ]; 
  FILE *fpPtr; 

  if ( ( fpPtr = fopen( "sorted_file.txt", "r" ) ) == NULL ) {
    printf( "File could not be opened\n" );
  } 
  else {
    printf( "%s\n", "Name" );
    fscanf( fpPtr, "%s", name );

    while( !feof( fpPtr ) ) {
       printf( "%s\n", name );
       fscanf( fpPtr, "%s", name );
    } 

    fclose( fpPtr ); 
  } 

 return 0; 
};

我想知道这个程序使用了多少内存。我应添加的任何代码或函数,以查找此程序使用的总内存。我不想为此检查任务管理器。我需要打印内存使用情况。

2 个答案:

答案 0 :(得分:3)

听起来好像你在GetProcessMemoryInfo()之后。

您需要使用Windows SDK或mingw32中相应的Windows标头来编译它(也可以在Visual Studio中使用,以及使用适当的库运行cygwin等):

#include <windows.h> // these header gives you access to the Windows API -
#include <psapi.h> // include at the top of your code

// do this where you need to get that information - perhaps create a function
// for it.

HINSTANCE hProcHandle = GetModuleHandle(NULL);  // get the current process handle
PROCESS_MEMORY_COUNTERS_EX memory; // output will go here.

/* call function */
GetProcessMemoryInfo(hProcHandle, &memory, sizeof(memory));

您现在应该能够访问memory.WorkingSetSizememory.PrivateUsage,无论哪种衡量标准对您有用。这些是size_t类型,它们是大小取决于系统的无符号整数。

答案 1 :(得分:2)

前几天你问过here,我给了你这个答案:

  

虽然它不再被积极开发,但对于C和ObjC代码   (我用过它),我找不到比MSS: Memory Supervision System更好的东西。

     

它非常简单易用;一直很   根据我的经验准确,我已经用它来清除效果   我的应用程序中的任何内存泄漏。

     

让你知道它的易用性:我把它编译成了一个   静态库,将其链接到我的程序的调试目标并放入   include(导入ObjC)将单数标题转换为公共共享   我的程序的所有其余部分使用的标题,因此它跟踪内存   在整个计划中,甚至不需要考虑它。

MSS将完全按照您的要求行事;它还会为您提供大量额外(非常有用)的信息,但报告的顶部包含以下内容:

MSG: Listing info about allocated blocks at end of program:
INFO: 107 blocks currently allocated
INFO: 11720 bytes of memory currently used.
INFO: 2384479 bytes maximum memory used.

在这些行中,它会告诉您泄漏了多少内存块,确切泄漏了多少内存以及程序使用的最大内存占用量。

如何使用MSS:

首先使用makefile构建库;只需使用make lib,因为我们不需要测试程序。如果您不使用gcc,则需要更改makefile中的默认编译器。如果您正在使用gcc并且同时需要64位和32位版本,请将-m64-m32添加到第53行CFLAGS=...,然后在{0}上运行make文件。

您现在应该拥有一个可以链接到您的程序的静态MSS库。您需要在程序中包含的唯一标头是mss.h。要实际使用MSS,您需要#define MSS#include <mss.h>到您希望跟踪的每个文件中。如果要跟踪整个程序,请在编译器的参数中定义MSS,并将其包含在每个源文件包含的通用标头中。

这就是字面意思;如果您希望更改其日志和其他功能的详细程度,可以添加到程序目录中的配置文件,但要使其正常工作,这就是您需要做的全部工作。顺便说一句,MSS在其doc文件夹中包含一个完整的读取文件,更详细地描述了所有这些内容。