Освобождение всех созданных malloc () указателей одной командой? - PullRequest
2 голосов
/ 20 февраля 2010

Есть ли одна строка, которая освободит память, занятую всеми указателями, которые вы создали с помощью malloc s? Или это можно сделать только вручную, free используя каждый указатель отдельно?

Ответы [ 6 ]

6 голосов
/ 20 февраля 2010

Вы можете сделать это, создав своего рода «обертку» вокруг malloc. (предупреждение, что это только псевдокод, показывающий идею, проверки вообще нет)

void* your_malloc(size_t size)
{
    void* ptr = malloc(size);

    // add ptr to a list of allocated ptrs here

    return ptr;
}

void your_free(void *pointer)
{
    for each pointer in your list
    {
        free( ptr_in_your_list );
    }
}

Но это звучит не очень хорошая идея, и я бы, конечно, этого не сделал, по крайней мере, для общего назначения / освобождения. Лучше выделять и освобождать память ответственно, когда она больше не нужна.

3 голосов
/ 20 февраля 2010

Возможно, вы захотите посмотреть пулы памяти . Это структуры данных, созданные именно для этого.

Одна из распространенных реализаций - Apache Portable Runtime , которая используется на веб-сервере Apache, а также в других проектах, таких как Subversion.

2 голосов
/ 20 февраля 2010

malloc сам по себе имеет поведение, определяемое реализацией. Таким образом, нет необходимости отслеживать все указатели, которые у него есть, что, очевидно, сдерживает идею.

Вам потребуется создать собственный менеджер памяти, который отслеживает указатели, а затем предоставляет функцию с именем free_all или что-то, что просматривает список указателей и вызывает на них free.

Обратите внимание, это звучит как несколько плохая идея. Лучше быть немного более строгим / ответственным в отношении использования памяти и free вещей, когда вы закончите; не оставляйте их без дела.

Возможно, имея немного больше информации о том, где вы хотите применить свою идею, мы могли бы найти более простые решения.

1 голос
/ 17 июня 2016

Проверьте dlmalloc

ftp: //g.oswego.edu/pub/misc/malloc.h

посмотрите на следующие функции

/*
  mspace is an opaque type representing an independent
  region of space that supports mspace_malloc, etc.
*/
typedef void* mspace;

/*
  create_mspace creates and returns a new independent space with the
  given initial capacity, or, if 0, the default granularity size.  It
  returns null if there is no system memory available to create the
  space.  If argument locked is non-zero, the space uses a separate
  lock to control access. The capacity of the space will grow
  dynamically as needed to service mspace_malloc requests.  You can
  control the sizes of incremental increases of this space by
  compiling with a different DEFAULT_GRANULARITY or dynamically
  setting with mallopt(M_GRANULARITY, value).
*/
mspace create_mspace(size_t capacity, int locked);

/*
  destroy_mspace destroys the given space, and attempts to return all
  of its memory back to the system, returning the total number of
  bytes freed. After destruction, the results of access to all memory
  used by the space become undefined.
*/
size_t destroy_mspace(mspace msp);

...

/*
  The following operate identically to their malloc counterparts
  but operate only for the given mspace argument
*/
void* mspace_malloc(mspace msp, size_t bytes);
void mspace_free(mspace msp, void* mem);
void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
void* mspace_realloc(mspace msp, void* mem, size_t newsize);
0 голосов
/ 20 февраля 2010

Да, вы можете сделать это, если не напишите свое собственное определение malloc() и free(). Вы, вероятно, должны вызывать myCustomMalloc() вместо обычного malloc(), и вы должны отслеживать все указатели в некоторой ячейке памяти, а когда вы вызываете метод myCustomFree(), вы должны иметь возможность очистить все указатели, созданные с помощью ваш myCustomMalloc(). Примечание: оба ваших пользовательских метода будут вызывать malloc() и free() внутри

Таким образом, вы можете достичь своей цели. Я Java-человек, но я много работал на Си в ранние годы. Я предполагаю, что вы пытаетесь найти общее решение, когда память обрабатывается компилятором. Это имеет стоимость производительности, как это видно в Java. Вам не нужно беспокоиться о распределении и освобождении памяти. Но это серьезно влияет на производительность. Это компромисс, с которым вам придется жить.

0 голосов
/ 20 февраля 2010

Возможно, вы захотите сделать что-то, называемое «распределение арены», где вы выделяете определенные запросы из общей «арены», которые могут быть освобождены сразу после завершения.

Если вы работаете в Windows, вы можете использовать HeapCreate для создания арены, HeapAlloc для получения памяти из кучи / арены, которую вы только что создали, и HeapDestroy для освобождения всего сразу.

Обратите внимание, что когда ваша программа exit () s, вся память, выделенная вам с помощью malloc (), освобождается.

...