Digamos que tengo un puntero asignado para contener 4096 bytes. ¿Cómo se podrían desasignar los últimos 1024 bytes en C? ¿Qué tal en C++? ¿Qué pasaría si, en cambio, quisiera desasignar el primero 1024 bytes y mantener el resto (en ambos idiomas)? ¿Qué hay de la desasignación desde la mitad (me parece que esto requeriría dividirlo en dos punteros, antes y después de la región desasignada).C y C++: Liberación PARTE de un puntero asignado
Respuesta
Si tiene n
bytes de memoria malloc
ado, puede realloc
m
bytes (donde m
< n
) y por lo tanto tirar a la basura los últimos n-m
bytes.
Para tirar desde el principio, puede malloc
un nuevo y más pequeño búfer y memcpy
los bytes que desea y luego free
el original.
La última opción también está disponible con C++ new
y delete
. También puede emular el primer caso realloc
.
"malloc/memcpy/free" es cómo se puede implementar realloc internamente. – Roddy
Acepto que realloc generalmente devolverá la (misma) primera parte, pero ¿es un requisito oficial para realloc? Creo que aquí podría haber implementaciones que podrían mover los datos a un nuevo lugar. –
Imagine un esquema de reasignación inteligente en el que se rastrea el patrón histórico de asignaciones ... si ha habido solicitudes de asignación recientes para 4096 bytes, podría ser mejor mover el bloque de contracción en otro lugar para liberar este bloque 4K. En ese caso, la dirección cambiará. Y realloc devuelve un puntero a la nueva área de memoria, por lo que el programador debería usarla. Si cambia o no. – xcramps
Puede acortarlo con realloc(). No creo que el resto sea posible.
Puede usar realloc() para hacer que la memoria sea más corta. Tenga en cuenta que para algunas implementaciones, tal llamada no hará nada. No puede liberar el primer bit del bloque y retener el último bit.
Si necesita este tipo de funcionalidad, debería considerar el uso de una estructura de datos más compleja. Una matriz no es la respuesta correcta a cada problema de programación.
Estoy implementando un sistema de memoria, así que estoy buscando obtener como bajo nivel de acceso como puedo mientras permanezco portátil. – Imagist
http://en.wikipedia.org/wiki/New_(C%2B%2B)
Resumen: En contraste con realloc de C, que no es posible reasignar directamente memoria asignada con el nuevo []. Para ampliar o reducir el tamaño de un bloque, uno debe asignar un nuevo bloque de tamaño adecuado , copiar sobre la memoria anterior y eliminar el bloque anterior. La biblioteca estándar de C++ proporciona una matriz dinámica que se puede ampliar o reducir en su plantilla std :: vector.
No intente y adivine la administración de la memoria. Por lo general es más inteligente de lo que ;-)
El único que se puede alcanzar es el primer escenario a 'deallocate' el último 1K
char * foo = malloc(4096);
foo = realloc(foo, 4096-1024);
Sin embargo, incluso en este caso, no hay garantía de que "foo "no se modificará". Puede liberar su 4K completo y realloc() puede mover su memoria a otra parte, invalidando así cualquier apuntador que pueda tener.
Esto es válido tanto para C y C++ - Sin embargo, el uso de malloc() en C++ es un mal olor de código, y la mayoría de la gente esperaría que utilice nueva() a asignar almacenamiento. Y la memoria asignada con new() no puede ser realloc() ed, o al menos, no de ninguna manera portátil.Los vectores STL serían un enfoque mucho mejor en C++
No tiene "un puntero asignado para contener 4096 bytes", tiene un puntero a un bloque asignado de 4096 bytes.
Si su bloque fue asignado con malloc()
, realloc()
le permitirá reducir o aumentar el tamaño del bloque. Sin embargo, la dirección de inicio del bloque no necesariamente será la misma.
No puede cambiar la dirección de inicio de un bloque de memoria malloc
'd, que es realmente lo que su segundo escenario está haciendo. Tampoco hay forma de dividir un bloque malloc
'd.
Ésta es una limitación de la malloc
/calloc
/realloc
/free
API - e implementaciones pueden depender de estas limitaciones (por ejemplo, mantener la información de contabilidad sobre la asignación inmediatamente antes de la dirección de inicio, lo que haría mover la dirección de inicio difícil)
Ahora, malloc
no es el único asignador por ahí -. su plataforma o bibliotecas podrían proporcionar otros, o se puede escribir su propia (que se hace memoria del sistema a través malloc
, mmap
, o algún VirtualAlloc
otro mecanismo) y luego lo distribuye a su programa de la manera que desee.
Para C++, si asigna memoria con std::malloc
, se aplica la información anterior. Si está utilizando new
y delete
, está asignando almacenamiento y construyendo objetos, por lo que cambiar el tamaño de un bloque asignado no tiene sentido: los objetos en C++ tienen un tamaño fijo.
- 1. C y el puntero notación
- 2. C++ borrar un puntero a un puntero
- 3. C/C++ Puntero Pregunta
- 4. Puntero a un puntero en objetivo-c?
- 5. Puntero C++ a los objetos
- 6. ¿Qué significa un puntero-puntero const en C y en C++?
- 7. (nil) puntero en C/C++
- 8. Convertir del puntero C++/CLI al puntero nativo de C++
- 9. iPhone - depuración "puntero siendo liberado no fue asignado" errores
- 10. C# picturebox liberación de memoria problema
- 11. Pasando un puntero C con la API de Python/C
- 12. C++ - Obtener un puntero interno a un vector
- 13. Liberación de pista del objeto com C#.
- 14. Segregando el código de depuración y liberación en C#
- 15. Gestión de memoria Objective-C (asignación y liberación automática)
- 16. C++ asignación de puntero
- 17. ¿Cómo determinar el tamaño de un búfer C asignado?
- 18. Puntero de función C#?
- 19. Llamar C++ puntero de función de C#
- 20. elenco de puntero indirecto a un puntero de Objective-C
- 21. diferencia entre la liberación y dealloc en Objective-C
- 22. ¿Cuándo devolver un puntero, escalar y referencia en C++?
- 23. ¿Cambios de bits en un puntero C?
- 24. C++: Const corrección y puntero argumentos
- 25. C++ de referencias entre un puntero a
- 26. puntero sin formato C++ y std :: shared_ptr
- 27. ¿Cuáles son las operaciones soportadas por puntero sin formato y puntero de función en C/C++?
- 28. C#: Puntero a duplicar
- 29. ¿Puede un objeto asignado en el montón const en C++?
- 30. C - Compruebe si se ha asignado un número entero
no estoy seguro, pero usar el puntero "falso" con el tamaño correcto, eliminar o liberar el que desea debería hacer el truco, necesita al menos 2 punteros. – claf
@claferri. Eso es un comportamiento indefinido. Solo puede liberar punteros() devueltos desde malloc/realloc; de lo contrario, ¿cómo sabe free() cuánto liberar? – Roddy
@roddy: oups tienes razón :) – claf