W C (lub C++) Zastanawiam się, czy można częściowo zwolnić blok pamięci.Czy można częściowo zwolnić pamięć?
Na przykład, załóżmy, że tworzymy tablicę liczb całkowitych a
o rozmiarze 100,
int * a = malloc(sizeof(int)*100);
a później chcemy zmienić rozmiar a
tak, że posiada 20 ints zamiast 100.
Czy istnieje sposób na uwolnienie tylko ostatniego 80 * sizeof (int) bajtów z a
? Na przykład, jeśli zadzwonimy do realloc, czy zrobi to automatycznie?
- Szukam rozwiązania, które nie wymaga przenoszenia/kopiowania pierwszych 20 elementów.
- Możesz również wyjaśnić, dlaczego byłoby to złe, gdyby było to możliwe, lub dlaczego zdolność do tego nie była zawarta w żadnym z tych języków?
Nie przydziela ponownie kopii tablicy, a następnie zwolnić oryginał? – Cam
@Cam, nie. Dozwolone jest (i często będzie) zmniejszenie istniejącego regionu. –
@ watson1180: Racja, ale to nic nie znaczy. Zasadniczo realloc może zostać zaimplementowany, aby uzyskać czas O (n!^99) i zawsze przydzielić 500 razy potrzebną pamięć, ale z pewnością nie uwzględniamy tego przy podejmowaniu decyzji dotyczących ponownego przydziału. – Cam