我正在写一个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 / / smaps和/ PROC / /地图,其中是当前进程id

检查本博文的进行。

Valgrind的的地块工具支持堆栈和堆仿形。您可能要检查它的源代码,看看它是怎么做的。

有关堆的一部分,也许你打的资源限制。检查出

您可以使用Valgrind的堆栈分析,但你有什么打算用它做什么?堆栈是不是像堆。你说,你想为调试目的这样做。如果程序运行正常,那么就没有问题堆栈(至少与它的大小)。

您可以设置为所创建的线程的堆栈大小和通过查看本地变量(它必须不被优化出)地址检查堆栈指针值。只需通过使用初始规模,初始堆栈指针值和当前堆栈指针值做一些数学,你会得到一些不错的数字。只是不要忘记先找出叠放方向。这可以从平台改变平台。

我想,如果你在乎这么多了堆的使用情况,那么你的程序可能出现内存泄漏。在这种情况下,Valgrind的能指出正确的方向。 Valgrind的

getrlimit与RLIMIT_STACK的paramater会告诉你总共有多少堆栈空间是存在的。 随着RLIMIT_AS的参数,你可以找出多少虚拟内存有。

有关的更多信息看看 http://linux.die.net/man/2/ getrlimit

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top