2010-12-15 25 views
7

En C (o C++) me pregunto si es posible desasignar parcialmente un bloque de memoria.¿Es posible desasignar parcialmente la memoria?

Por ejemplo, supongamos que creamos una matriz de enteros a de tamaño 100,

int * a = malloc(sizeof(int)*100); 

y luego queremos cambiar el tamaño a manera que tiene capacidad para 20 enteros en lugar de 100.

¿Hay una forma de liberar solo los últimos 80 * sizeof (int) bytes de a? Por ejemplo, si llamamos a realloc, ¿lo hará automáticamente?

  • Estoy buscando una solución que no requiera mover/copiar los primeros 20 ints.
  • Como alternativa, ¿puede explicar por qué sería malo si esto fuera posible o por qué la capacidad de hacer esto no estaba incluida en ninguno de los dos idiomas?

Respuesta

14

Puede usar realloc, pero definitivamente debe considerar el uso de contenedores STL en lugar de asignar manualmente la memoria.

+1

¿No copia realloc la matriz y luego libera el original? – Cam

+4

@Cam, no. Está permitido (y a menudo) reducir la región existente. –

+4

@ watson1180: Correcto, pero eso solo no significa nada. En principio, realloc podría implementarse para tomar O (n!^99) tiempo y asignar siempre 500 veces la memoria necesaria, pero ciertamente no se tiene en cuenta al tomar decisiones que involucran a realloc. – Cam

3

Preferimos contenedores RAII a punteros sin formato en C++.

#include <vector> 

// ... 

{ 
    std::vector<int> a(100) 
    // ... 
    std::vector<int>(a.begin(), a.begin() + 20).swap(a); 
} 
+4

Cabe señalar que esto realmente no "desasigna parcialmente la memoria". Esto asigna un nuevo bloque del tamaño deseado, copia el contenido del bloque original y luego libera el bloque original. –

+1

¿Qué hay de malo con '.resize (20)'? (Soy un novato de C++) – dreamlax

+1

resize() no tiene que ajustar la memoria asignada. Incluso clear() no tiene que hacerlo. –

2

Yo preferiría usar un std::vector. Vamos a habilitar C++ 0x:

std::vector<int> vec(20); 
vec.reserve(100); 

// do something 

vec.shrink_to_fit(); 

De n3092 (no el proyecto de manera definitiva, que necesita para obtener una copia nueva en esta PC):

void shrink_to_fit();

Observaciones: shrink_to_fit es un no -solicitud de enlace para reducir el uso de memoria. [Nota: la solicitud no es vinculante para permitir la flexibilidad de optimizaciones específicas de la implementación. -finalizar]

Cuestiones relacionadas