2010-12-15 5 views
7

In C (o C++) mi chiedo se sia possibile deallocare parzialmente un blocco di memoria.È possibile deallocare parzialmente la memoria?

Per esempio, supponiamo di creare un array di interi a di dimensioni 100,

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

e poi vogliamo ridimensionare a in modo che tenga 20 int anziché 100.

C'è un modo per liberare solo gli ultimi 80 * sizeof (int) byte di a? Ad esempio, se chiamiamo realloc, lo farà automaticamente?

  • Sto cercando una soluzione che non richieda lo spostamento/la copia dei primi 20 pollici.
  • In alternativa, puoi spiegare perché sarebbe male se ciò fosse possibile o perché la capacità di farlo non fosse inclusa in nessuna delle due lingue?

risposta

14

È possibile utilizzare realloc, ma è consigliabile prendere in considerazione l'utilizzo di contenitori STL anziché allocare manualmente la memoria.

+1

Non realloc copia l'array e quindi libera l'originale? – Cam

+4

@Cam, no. È permesso (e spesso lo farà) di restringere la regione esistente. –

+4

@ watson1180: Giusto, ma questo da solo non significa niente. In linea di principio, realloc potrebbe essere implementato per prendere il tempo O (n!^99) e allocare sempre 500 volte la memoria necessaria, ma di certo non lo consideriamo quando prendiamo decisioni che coinvolgono realloc. – Cam

3

Preferiamo i contenitori RAII a puntatori grezzi in C++.

#include <vector> 

// ... 

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

Va notato che questo in realtà non "rilascia in parte la memoria". Questo alloca un nuovo blocco della dimensione desiderata, copia il contenuto dal blocco originale e quindi libera il blocco originale. –

+1

Cosa c'è di sbagliato in '.resize (20)'? (Sono un noob C++) – dreamlax

+1

ridimensiona() non è necessario regolare la memoria allocata. Anche clear() non deve. –

2

Preferirei usare un std::vector. Diamo consentono C++ 0x:

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

// do something 

vec.shrink_to_fit(); 

Da n3092 (non il progetto in modo definitivo, ho bisogno di ottenere una nuova copia su questo PC):

void shrink_to_fit();

Osservazioni: shrink_to_fit è un non - richiesta vincolante per ridurre l'uso della memoria. [Nota: la richiesta non è vincolante per consentire la latitudine per ottimizzazioni specifiche dell'implementazione. -end note]