¿Cómo desasigno la memoria asignada dinámicamente, sin usar nueva o malloc, sin usar gratis o eliminar?

Depende de por qué quieres desasignar la memoria. ¿Es un espacio o un problema de seguridad o ambos? El número 6 a continuación es mi mejor respuesta, sin saber ningún detalle sobre el problema que está tratando de resolver.

0. Controle el problema y no utilice la asignación dinámica.
1. matar o salir del programa
2. cerrar sesión
3. reiniciar

o

4. dentro de C / C ++: depende de cómo lo asignó, como dijo Alex en la primera respuesta.
Una alternativa sin liberar la memoria sería escribirle ceros.

5. Hágalo de la manera más difícil: escriba su propia función para acceder al método que utilizó para asignar la memoria adicional y desasignarlo usted mismo.

6. Utilice el sistema de asignación temporal proporcionado por la pila utilizando variables temporales dentro de la función. deberá saber de antemano cuánta memoria asignar en la pila, lo que significa que * -> no puede asignar dinámicamente <- *. Una vez que la función regresa a la persona que llama, el programa desasignará automáticamente las variables temporales. Hay advertencias aquí: por lo general, la pila se asigna en trozos de un megabyte. Es posible que deba cambiar un parámetro del sistema para asignar trozos más grandes, pero esto es un problema con las limitaciones de tamaño de la memoria porque CADA función puede poner tanta memoria en la pila (la recursión eliminará la utilidad del programa). YMMV.

Nota: El uso de más memoria de la que tiene RAM puede hacer que el programa se “ejecute fuera del disco duro”, lo que ralentizará el programa y el sistema se reducirá (debido a un intercambio excesivo) a un rastreo inmanejable.

Según el sistema, las bibliotecas y la función que use, puede encontrar características que le permitan reasignar / reutilizar fácilmente la memoria ya asignada.

Finalmente, asigne memoria permanentemente y reutilice eso programáticamente.

Buena suerte.

Si quiere decir que desea asignar dinámicamente memoria, pero no necesita desasignarla manualmente … eso es recolección de basura. C / C ++ no tiene GC … al menos no como estándar.

Podría usar el recolector de basura Boehm (o algo similar), pero tenga en cuenta que eso significa que necesitará más RAM para que la mayoría de su código se ejecute a la misma velocidad. Esa es la compensación habitual cuando se va con un GC.

“Nuevo” hace algo totalmente diferente a Malloc. Hay un operador global nuevo, que es análogo a llamar a malloc, pero esto rara vez se ve. Más a menudo, adquirimos memoria de alguna manera, y llamamos ubicación nueva.
podría usar mmap, y colocar los objetos nuevos, y cuando lo haga, llame directamente a dtor y mapee la memoria. Esto funciona bien.

¿Está tratando de decir que ha asignado memoria dinámicamente sin usar malloc () o nuevo? Si ese es el caso, es muy probable que esté familiarizado con la implementación subyacente, específicamente las llamadas al sistema que se usan para mover el puntero de “interrupción” en el espacio de almacenamiento dinámico de su programa. En este caso, debería poder desasignar también sin realmente usar llamadas de alto nivel como malloc o nuevas.

Asumiré que ha asignado memoria usando malloc o nuevo, pero me gustaría saber cómo desasignar sin usar gratis / eliminar.

Yo diría que es una mala idea porque la cantidad de espacio solicitado por su programa en la llamada a malloc es el espacio mínimo que debe asignarse. Por ejemplo, si desea asignar dinámicamente una memoria de 10 bytes, es muy probable que el puntero devuelto apunte al inicio de un espacio de 16 bytes y no exactamente 10 bytes debido a los requisitos de alineación; el puntero se alineará en Límite de 8 o 16 bytes en arquitecturas modernas, especialmente en x86.

Durante free (), la implementación subyacente no devuelve el espacio. El fragmento aún se asigna al espacio de direcciones virtuales de su programa y, por lo tanto, sigue siendo parte del espacio de almacenamiento dinámico. Una vez que el puntero de interrupción se mueve hacia adelante por la llamada a malloc (), la llamada free () correspondiente solo establecerá algunos bits de bandera en la estructura de datos utilizada por la implementación para representar el fragmento e indicará que esta porción de espacio es libre y un candidato para la asignación por futuras llamadas a malloc (). Estoy hablando desde el punto de vista de la implementación de malloc () y free () usando las llamadas brk () / sbrk (). No estoy seguro de qué sucede exactamente cuando se implementa el uso de llamadas mmap () y munmap ().

Ahora volvamos a tu pregunta. Probablemente esté usando malloc o nuevo para asignar memoria, lo que me dice que realmente no tiene acceso a la (s) estructura (s) de datos subyacentes que se utilizan para representar un bloque / porción de espacio asignado dinámicamente y devuelto al programa de usuario simplemente porque no está utilizando su propia implementación o cualquier otra implementación de “asignación de memoria dinámica”. En este caso, no creo que realmente puedas liberar el espacio sin pasar por las llamadas regulares para liberar () o eliminar. Harán lo que se supone que deben hacer para dar cuenta de la porción de espacio liberada por su programa.

Depende de la forma en que haya asignado la memoria. La dislocación es un compañero para la asignación. Así que las parejas son:

  • mmap – munmap
  • brk / sbrk – brk / sbrk
  • malloc – gratis
  • nuevo – borrar
  • alloca – retorno

Y también toda la memoria del proceso se libera automáticamente cuando el proceso termina. Asi que:

  • * – salida