En el uso de la memoria estática C ++ ------ pila Vs Vs dinámica montón de punteros inteligentes

C ++ general sobre la memoria

  En C ++, la memoria se divide en cinco áreas: Pila, Montón, tienda libre, / área de almacenamiento estática global y el área de almacenamiento constante.

  • memoria estática: memoria estática se utiliza para almacenar un objetos estáticos locales, las clases, los miembros de datos estáticos, y definir una variable fuera de cualquier función (variable global).
  • Pila de memoria: memoria de pila se utiliza para mantener los objetos no estáticos dentro de una función definida.
  • la pila de memoria: la memoria utilizando el nuevo espacio abierto de palabras clave se encuentra en la memoria de pila, los programadores han dado a conocer (no por el compilador es responsable), un nuevo general corresponde a una eliminación, una nueva [] corresponde a una eliminación [], si el programador no se libera, al final del programa, el sistema se recuperará automáticamente los recursos.
  • tienda libre: Sí * alloc asignado espacio de memoria que se encuentra en el espacio libre, el uso gratuito de la liberación
  • área de almacenamiento constante: un área de almacenamiento especial, que mantiene constante, no puede ser modificado.
      Montón y el espacio libre es en realidad un banco de memoria entera, que pertenece a la misma zona, las nuevas llamadas implementación subyacente malloc, nueva versión avanzada de malloc puede ser visto como inteligente.

montón VS pila

  la pila de memoria y la memoria de pila es la memoria de dos áreas diferentes, ambos difieren en muchos aspectos, hay que dirigirse a:

  • gestión:
    • Montón de los recursos a programador de control, a veces se olvide de memoria libre, puede causar una pérdida de memoria (pérdida de memoria), a veces una unidad de memoria de datos todavía referencias de puntero, que sólo hay que poner la memoria, se producirá una referencia válida puntero de memoria.
    • Apilar los recursos gestionados de forma automática por el compilador, sin control manual.
  • la respuesta del sistema:
    • Pila de la pila, el sistema tiene una dirección de memoria libre de puntero de registro, el programa de aplicación cuando el sistema recibe, recorrer la lista enlazada, el primer nodo de encontrar un espacio de pila es mayor que el espacio de aplicación, eliminar un nodo de la lista libre, y ser asignado al programa. Si el tamaño del bloque de la memoria de pila es exactamente igual al tamaño del espacio de aplicación, la primera dirección se devuelve directamente al usuario, si el tamaño del bloque de memoria más grande que el tamaño solicitado, el desdoblamiento de bloques de esto, la porción restante de la memoria de pila restante memoria de pila disponible en forma de "montón vinculado lista" y otra de la memoria relacionada sin asignar. Si no se encuentra un bloque de memoria de almacenamiento dinámico para cumplir con el tamaño de toda la lista montón, el sistema le dará la "lista montón ligado" vincular un área más grande para su uso, si este paso es aún fracaso, malloc devolverá NULL, y los programadores de error.
    • Pila , siempre y cuando el espacio de pila restante es mayor que el espacio de aplicación, el sistema proporciona memoria para el programa, de lo contrario, informó una excepción en el desbordamiento de pila.
  • espacio
    • Heap : área de memoria de pila no es continuo, ya que el sistema utiliza un espacio libre para almacenar la lista enlazada, tamaño de la pila está limitada por la memoria virtual sistema informático activa (sistema de 32 bits teóricamente 4G), de modo que el espacio de pila es relativamente flexible, es relativamente grande.
    • Pila : La pila es una zona de memoria contigua, el tamaño predeterminado es un buen sistema operativo, se determina sobre una constante en tiempo de compilación. Si el espacio de la aplicación de pila que el espacio restante se le pedirá que rebose. Por lo tanto, menos espacio obtiene a partir de la pila.
  • escombros
    • Montón : Montón de uso frecuente nuevo / borrado hará que un montón de escombros, reducir la eficiencia del programa.
    • Pila : Para la pila, este último está fuera avanzada de la cola, y fuera de la correspondencia, sin residuos.
  • dirección de crecimiento
    • Pila : la pila extendida hacia arriba desde la parte inferior de las direcciones más altas.
    • Pila : pila hacia abajo, se extendía desde la dirección superior de la dirección inferior.
  • eficiencia en la asignación
    • Heap : montón que se asignan dinámicamente por la memoria asignada por nuevo, por lo general lento y propenso a los desechos, no es fácil de usar.
    • Pila : pila se asigna automáticamente por el sistema, hay tanto de forma estática asignada dinámicamente asignados. Más rápido, pero el programador no puede controlar.

malloc y libre

malloc

  De acuerdo con la definición de la función de la biblioteca estándar de C, malloc tiene el siguiente prototipo:

void* malloc(size_t size);

Para lograr esta función de distribución de función es un período continuo de memoria disponible en el sistema, en concreto:

  • Malloc asigna tamaño de la memoria de al menos el número de bytes especificados por el parámetro de tamaño.
  • valor de retorno de malloc es un puntero a la dirección inicial de la sección de memoria disponible.
  • Varias llamadas a malloc direcciones asignado no deben superponerse, a menos que se libera una dirección asignada malloc particular.
  • asignación de memoria malloc debe ser completado tan pronto como sea posible y vuelta (sin el uso de algoritmos de asignación de memoria son NP-duro).
  • Malloc debe alcanzar para lograr el cambio de tamaño y cancelación de asignación de la función de memoria (realloc, gratis)

gratis

  función libre se usa antes de la liberación de la llamada malloc, calloc, realloc el espacio de memoria asignada, tiene el siguiente prototipo:

void free(void *ptr);

  implementación libre no parece tan simple, para ser libre, primero tenemos que abordar dos cuestiones fundamentales:

  • 1. ¿Cómo verificar que la dirección de entrada es válida, que se determina que la primera dirección asignada por el área de datos de manera malloc. Para resolver este problema, en primer lugar determinar la dirección antes de la región asignada cambio malloc, es decir, en el puntero de área first_block y la ruptura de corriente, en segundo lugar antes de que la dirección de comienzo asignado por malloc.
  • 2. ¿Cómo resolver el problema de la fragmentación.

nueva suma borrar

  En C ++, la división de gestión de memoria dinámica se lleva a cabo por un par de operadores. nuevo: en el espacio de memoria dinámica asignada para el objeto y devuelve un puntero que apunta al objeto, podemos elegir para inicializar el objeto. Eliminar: para aceptar un puntero de objeto dinámico, destruir el objeto, y libera la memoria asociada a ella.
La diferencia entre malloc y nueva

  • función de la biblioteca estándar malloc / Free, nuevo / operadores de eliminación en C ++;
  • malloc no regresó vacío, nuevo fracaso se produce una excepción;
  • nuevo / borrado llamadas del constructor, destructor, malloc / libres no, así que lo que no puede cumplir con los requisitos de objetos dinámicos.
  • Devuelve un puntero con un nuevo tipo, devoluciones malloc puntero sin tipo.

Punteros inteligentes

  Para que sea más fácil y seguro de usar la memoria dinámica, la biblioteca estándar de C ++ proporciona un nuevo tipo de puntero inteligente para administrar objetos dinámicos. Es similar al puntero normal, una diferencia importante es que es responsable de liberar automáticamente los objetos a que se refiere. Debido a que el puntero inteligente es una clase, cuando la clase sale del ámbito, el destructor de la clase llamará automáticamente al destructor se liberará automáticamente los recursos. Por lo que el papel del principio de puntero inteligente es automáticamente el espacio de memoria de hasta libre al final de la función, sin la necesidad de liberar manualmente el espacio de memoria.

  • shared_ptr permite que varios punteros al mismo objeto, el objeto se repita recurso relevante se dará a conocer en el "última referencia fue retirada" cuando. Se utiliza el mecanismo de conteo para indicar que los recursos se comparten varios punteros, se puede utilizar () para ver el propietario del recurso por el número de funciones miembro use_count.
  • unique_ptr lograr la propiedad exclusiva o tienen concepto estricto, garantizar que sólo un puntero inteligente puede apuntar al objeto en el mismo tiempo. Particularmente útil para evitar fugas de recursos
  • weak_ptr es un puntero inteligente no controla el ciclo de vida, que apunta a un objeto gestionado por shared_ptr. Sé el objeto de gestión de memoria es fuerte shared_ptr referencias, weak_ptr sólo proporciona un medio de acceso a los objetos gestionados. Objeto del diseño es para encajar weak_ptr shared_ptr puntero inteligente introducido para ayudar en el trabajo shared_ptr, sólo puede ser de una u otra construcción de objetos weak_ptr shared_ptr, y su estructura destructor no causa un aumento o disminución en el recuento. weak_ptr se utiliza para resolver problemas cuando el pensamiento de shared_ptr referirse unos a otros, si dos shared_ptr se refieren el uno al otro, entonces el contador de referencias de dos punteros, nunca se redujo a 0, el recurso no se libera.
Publicado siete artículos originales · ganado elogios 2 · Vistas 498

Supongo que te gusta

Origin blog.csdn.net/NewB20143864/article/details/104797261
Recomendado
Clasificación