Можно ли частично освободить память? - PullRequest
7 голосов
/ 15 декабря 2010

В C (или C ++) мне интересно, возможно ли частично освободить блок памяти.

Например, предположим, что мы создаем массив целых чисел a размером 100,

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

, а затем мы хотим изменить размер a, чтобы оно содержало 20 дюймов, а не 100.

Есть ли способ освободить только последние 80 * sizeof (int) байтов a? Например, если мы вызовем realloc, он будет делать это автоматически?

  • Я ищу решение, которое не требует перемещения / копирования первых 20 дюймов.
  • В качестве альтернативы, вы можете объяснить, почему было бы плохо, если бы это было возможно, или почему способность сделать это не была включена ни в один из языков?

Ответы [ 3 ]

15 голосов
/ 15 декабря 2010

Вы можете использовать realloc , но вам определенно следует рассмотреть возможность использования контейнеров STL вместо выделения памяти вручную.

3 голосов
/ 15 декабря 2010

Мы предпочитаем RAII-контейнеры необработанным указателям в C ++.

#include <vector>

// ...

{
    std::vector<int> a(100)
    // ...
    std::vector<int>(a.begin(), a.begin() + 20).swap(a);
}
2 голосов
/ 15 декабря 2010

Я бы предпочел использовать std::vector. Давайте включим C ++ 0x:

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

// do something

vec.shrink_to_fit();

Начиная с n3092 (не такой окончательный вариант, мне нужно получить свежую копию на этом ПК):

void shrink_to_fit();

Замечания: shrink_to_fit - это необязательный запрос для сокращения использования памяти. [Примечание: запрос не является обязательным, чтобы разрешить широту для специфических для реализации оптимизаций. —Конечная записка]

...