Обработка памяти в c - PullRequest
0 голосов
/ 18 декабря 2011

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

Кто-нибудь имеет представление о какой-либо служебной функции, которую можно использовать в C для выделения и освобождения памяти?

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

Ответы [ 4 ]

2 голосов
/ 18 декабря 2011

Если вы просто ищете единый способ (без дублирования кода), чтобы проверить, было ли выделение успешным или нет, см. Последний сегмент этого поста.


Прежде всего boostв основном это библиотека для C++, поэтому все boost нельзя использовать в C.

Написать свой собственный сборщик мусора непросто, особенно на языке без истинного ООП (например, C).В Интернете доступно множество реализаций сборщиков мусора, поэтому вместо того, чтобы заново изобретать колесо, вы можете проверить некоторые из них.

Если вы не собираетесь использовать какой-либо из них, хорошо ... по крайней мере, они предоставят вамс некоторой информацией о том, как решить эту проблему.


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

C существует уже много лет, и многие разработчики обходились без автоматического сборщика мусора.Почему вы не можете сделать то же самое?


Простая проверка ошибок при распределении (и отмена при ошибке)

#include <stdio.h>
#include <stdlib.h>

void*
safe_alloc_check (void *p, size_t size) {
  if (p == NULL) {
    printf ("ERROR: Unable to allocate memory for %lu bytes!", size);
    exit (-1);
  }

  return p;
}

#define s_malloc(N) safe_alloc_check(malloc(N),N)
#define s_calloc(C,N) safe_alloc_check(calloc(C,N),N)
#define s_realloc(P,N) safe_alloc_check(realloc(P,N),N)

...

int *p = s_malloc (sizeof (int));
2 голосов
/ 18 декабря 2011
0 голосов
/ 18 декабря 2011

Я не уверен, что вы после.Часто используемая техника для обработки выделения и освобождения памяти в C заключается в реализации структуры данных трассировки памяти , которая содержит несколько указателей на память, которая была выделена с использованием вашей собственной реализации malloc, calloc, realloc, например mymalloc, mycalloc, myrealloc(вызывая сами оригинальные функции), а затем используя новую функцию free_memtrace, чтобы освободить всю память, записанную в трассировке, за один вызов функции.

Так, например, вы можете сделать

MEMTRACE mt;  // Possibly a module-scoped global variable

begin_memtrace( &mt );
    ptr1 = mymalloc( size );
    ptr2 = mycalloc( n, sizeof(type) );
end_memtrace( &mt );

, а затем в какой-то момент в вашей программе

free_memtrace( &mt );

очистить память, записанную в mt.

Функции begin_memtrace, end_memtrace необходимы для того, чтобы ваши функции выделения «знали», куда записывать указатели.Эта информация может храниться локально в модуле, где вы реализуете mymalloc, mycalloc, myfree, free_memtrace ....

0 голосов
/ 18 декабря 2011

Обтекание malloc в функции (часто называемой xmalloc), которая прерывается, когда malloc не может вернуть новый фрагмент памяти (возвращая NULL).

Если вы работаете в системе Unix, полезно использовать valgrind для обнаружения утечек памяти.

Если вы хотите сборщик мусора для C, рассмотрите возможность использования Сборщик мусора Boehm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...