如何找出多少可用内存是如何留在GNU C ++在Linux
题
我正在写一个C ++程序(用gcc编译和在RedHat Linux运行)。该程序需要在运行时知道有多少剩余空间在堆栈上,有多少留在堆。我意识到可能没有一个明确的回答这个问题(关于堆),所以或者,我可以用从堆中,而不是已分配的内存量。是否有一个图书馆/系统功能调用,这将使我这个数据?
我想补充一点,我只需要这为调试目的,只需要粗略估算,如此快速和肮脏的解决方案是完全可以接受的。然而,我需要查询的存储器使用很频繁,所以炮击到Unix CMD行实用程序和分析其输出是不能接受的。
没有正确的解决方案
其他提示
您或许可以创建自己的新的和删除的功能,它封装了真正的new和delete操作,并注意内存使用在同一时间。
有关栈,还有在C一招,你看看在当前的功能定义,以获取有关栈指针是目前一个粗略的想法的第一个局部变量的地址。我想它应该用C ++的工作,但还没有尝试过。
在Linux上可以读/ PROC / pid
/状态
要知道,在32位系统中,栈向下增长和堆向上增长,这两个可能在中间某个地方相遇。空间可能,因此,被分配到堆栈或堆,但不能同时在同一时间。需要注意的是共享内存段(如果你使用它们)的存储器映射复杂化。所以可以动态加载(共享)库。
+------------+
| stack | high addresses
| | |
| v |
+------------+
| |
| unused |
| |
+------------+
| |
| ^ |
| | |
| heap |
| |
+------------+
| |
| bss |
| |
+------------+
| |
| data |
| |
+------------+
| |
| text |
| | low addresses
+------------+
在一个64位的系统中,存在的是你发生碰撞之前用完真实和虚拟内存足够的地址空间。
另外,还要注意(至少某些版本)的Linux都愿意说更多的内存可以分配比他们实际上可以支持 - 他们过度承诺。这不是很好。这意味着样试用的内存分配实际实验可能会给你安全的错觉。
最有可能的,你是最好的关闭问“是的剩余空间的X MB(GB?)”,而不是“的空间有多少MB(GB?)留”。其他人指出,/proc
文件系统的信息,多少内存在使用源。我不知道是否可靠地告诉你多少内存可抢。
这是一个C函数返回在树莓PI的可用内存量。 它通过读取的/ proc / meminfo中。我不知道这是否适用于其他系统。
#include <stdio.h>
#include <string.h>
// Return the amount of free memory in kbytes.
// Returns -1 if something went wrong.
int getfreememory()
{
int returnValue;
const int BUFFER_SIZE = 1000;
char buffer[BUFFER_SIZE];
FILE *fInput;
int loop;
int len;
char ch;
returnValue = -1;
fInput = fopen("/proc/meminfo","r");
if (fInput != NULL)
{
while (!feof(fInput))
{
fgets(buffer,BUFFER_SIZE-1,fInput);
if (feof(fInput))
{
break;
}
buffer[BUFFER_SIZE-1] = 0;
// Look for serial number
if (strncmp(buffer,"MemFree:",8)==0)
{
// Extract mem free from the line.
for(loop=0;loop<BUFFER_SIZE;loop++)
{
ch = buffer[loop];
if (ch == ':')
{
returnValue = 0;
continue;
}
if (ch == 0)
{
break;
}
if (returnValue >=0)
{
if (ch >='A')
{
break;
}
if ((ch >='0') && (ch <='9'))
{
returnValue = returnValue * 10 + (ch-'0');
}
}
}
break;
}
}
fclose(fInput);
}
return returnValue;
}
可以在检查/ PROC命名空间中的文件的/ proc /
检查本博文的进行。
Valgrind的的地块工具支持堆栈和堆仿形。您可能要检查它的源代码,看看它是怎么做的。
getrlimit与RLIMIT_STACK的paramater会告诉你总共有多少堆栈空间是存在的。 随着RLIMIT_AS的参数,你可以找出多少虚拟内存有。
有关的更多信息看看 http://linux.die.net/man/2/ getrlimit