在Windows下用C语言找到程序使用的总内存

3

我有一个用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; 
};

我想找出这个程序使用了多少内存。有什么代码或函数可以添加以查找程序使用的总内存。我不想在任务管理器中检查此内容。我需要打印内存使用情况。


你想知道这个程序的增量使用情况吗?还是你想知道整个程序的内存成本,包括库、操作系统打开文件的开销等? - wallyk
可能是在Windows下C程序的内存使用情况的重复。 - Ken White
2
这个问题比你之前的问题好多了,做得很好,但是当你没有得到答案时,请不要开新的问题。要么改进原始问题以至于它可以得到答案,要么发布赏金来吸引更多人关注你的问题。谢谢! - sarnold
2个回答

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类型,它们是无符号整数,其大小取决于您的系统。


2
你刚刚在这里提出了同样的问题,我给了你这个答案:
尽管它已经不再被积极开发,但对于C和ObjC代码(我所使用的),我没有找到比MSS更好的东西:内存监视系统。
它非常直观和易于设置;在我的经验中非常准确,我已经成功地使用它来清除应用程序中的任何内存泄漏。
为了让你了解它有多容易使用:我将其编译成静态库,将其链接到我的程序的调试目标,并将单一头文件的包含(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=...,然后只需在文件上运行make
现在,您应该拥有MSS的静态库,可以将其链接到您的程序中。除库之外,您需要在程序中包含的唯一头文件是mss.h。要实际使用MSS,您需要在希望进行跟踪的每个文件中定义#define MSS#include <mss.h>。如果要跟踪整个程序,请在编译器参数中定义MSS,并在每个源文件包含一个通用标头。
这就是全部。如果您想更改程序日志的详细程度和其他功能,可以将配置文件添加到程序目录中,但要使其正常工作,只需这样做。顺便说一下,MSS在其文档文件夹中包含完整的自述文件,对所有这些内容进行了更详细的描述。

但是我不明白如何使用这个。 - shruti_rathee
这个回答比你之前的那个好,做得很好,但通常情况下,当你发现重复的帖子时,请标记它们以引起管理员的注意。如果能早期发现重复帖子,那么它有助于我们修剪网站。 :) 谢谢! - sarnold
我已经详细阐述了如何实际使用MSS;如果您仍不理解,我强烈建议下载并阅读它所包含的说明。它提供非常详细的指导,告诉您如何先让它工作,然后如何配置和充分使用它。MSS确实是您可以使用的这种库中最容易使用的之一。 - Rabbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接