Pregunta

Estoy escribiendo un programa en C ++ (compilado con gcc y funcionando en RedHat Linux). El programa necesita saber en tiempo de ejecución la cantidad de espacio que queda en la pila y cuánto queda en el montón. Soy consciente de que no puede haber una respuesta definitiva a esta pregunta (sobre el montón), por lo que, alternativamente, podría usar la cantidad de memoria ya asignado en lugar del montón. ¿Hay una llamada a una función de una biblioteca / sistema que me dará estos datos?

Me gustaría añadir que yo sólo necesito esto para fines de depuración, y sólo necesito estimaciones aproximadas, por lo que las soluciones rápida y sucia-son perfectamente aceptables. Sin embargo, necesito para consultar el uso de la memoria con mucha frecuencia, por lo que los bombardeos a cabo a una utilidad Unix cmd línea y analizar su producción no es aceptable.

No hay solución correcta

Otros consejos

Es probable que pueda crear su propio nuevo y eliminar funciones que encapsula el verdadero nuevo y eliminar los operadores y tomar nota del uso de la memoria al mismo tiempo.

Para pila, hay un truco en C donde se toma un vistazo a la dirección de la primera variable local definida en su función actual para obtener una idea aproximada acerca de que el puntero de pila es por el momento. Supongo que debería funcionar en C ++, pero no lo he probado.

en Linux se puede leer / proc / pid / status

Tenga en cuenta que en los sistemas de 32 bits, la pila crece hacia abajo y la pila crece hacia arriba, y los dos podría reunirse en algún lugar en el medio. El espacio podría, por lo tanto, se asignará a la pila o montón, pero no a ambos al mismo tiempo. Nótese que los segmentos de memoria compartida (si se utilizan) complican el mapa de memoria. Así puede cargar dinámicamente las bibliotecas (compartidos).

+------------+
|    stack   | high addresses
|      |     |
|      v     |
+------------+
|            |
|   unused   |
|            |
+------------+
|            |
|      ^     |
|      |     |
|    heap    |
|            |
+------------+
|            |
|     bss    |
|            |
+------------+
|            |
|    data    |
|            |
+------------+
|            |
|    text    |
|            | low addresses
+------------+

En un sistema de 64 bits, no hay suficiente espacio de direcciones que se queda sin memoria real y virtual antes de que ocurran las colisiones.

Además, tenga en cuenta que (al menos algunas versiones de) Linux están dispuestos a decir más memoria se puede asignar de lo que realmente puede soportar - que sobre-comprometerse. Eso no es muy bueno. Esto significa que los experimentos prácticos como las asignaciones de memoria juicio le puede dar una falsa sensación de seguridad.

Lo más probable es que usted es el mejor de preguntar '¿Es la MB x (GB?) De espacio de la izquierda', en lugar de 'cuántos MB (GB?) De espacio que queda'. Otras personas señalaron que el sistema de archivos /proc como una fuente de información para la cantidad de memoria en uso. No estoy seguro de si es fiable le informa acerca de la cantidad de memoria disponible para agarrar.

Esta es una función C para volver la cantidad de memoria libre en el PI de la frambuesa. Funciona leyendo en el directorio / proc / meminfo. No estoy seguro de si funciona para otros sistemas.

#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;
}

Puede comprobar en el directorio / proc espacio de nombres de los archivos / proc / / smaps y / proc / / mapas, donde es el identificador de proceso actual.

esta entrada de blog a cabo.

herramienta Macizo de Valgrind soporta tanto pila y montón de perfiles . Es posible que desee comprobar su código fuente para ver cómo lo hace.

En la parte montón, tal vez usted está golpeando un límite de recursos. Echa un vistazo a este .

Es posible utilizar Valgrind para el perfilado de pila, pero ¿qué va a hacer con él? Pila no es como Montón. Usted dice, que quiere hacer esto para fines de depuración. Si el programa se ejecuta correctamente, entonces no hay problema pila (en relación con su tamaño por lo menos).

Es posible ajustar el tamaño de la pila de los hilos que ha creado e inspeccionar el valor del puntero de pila observando la variable local direcciones (de salida optimizada que no debe ser). Sólo hacer algunos cálculos utilizando el tamaño inicial, valor inicial del puntero de pila y el valor del puntero de pila actual, obtendrá algunos números agradables. Eso sí, no se olvide de averiguar la dirección de pila en primer lugar. Esto puede cambiar de plataforma en plataforma.

Creo que si le interesa esta cantidad por el uso del montón, entonces su programa probablemente pérdidas de memoria. En este caso, Valgrind puede apuntar a la dirección correcta. Valgrind

getrlimit con un parámetro de de RLIMIT_STACK le dirá la cantidad de espacio de pila es allí en total. Con un parámetro de rlimit_as se puede averiguar la cantidad de memoria virtual que existe.

Para obtener más información vistazo a http://linux.die.net/man/2/ getrlimit

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top