我在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;
};
我想知道这个程序使用了多少内存。我应添加的任何代码或函数,以查找此程序使用的总内存。我不想为此检查任务管理器。我需要打印内存使用情况。
答案 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.WorkingSetSize
或memory.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文件夹中包含一个完整的读取文件,更详细地描述了所有这些内容。