Как я могу сделать автоматическое управление памятью в C? - PullRequest
9 голосов
/ 26 июля 2011

Распределение / освобождение памяти в C выполняется malloc и free.

В C ++ выделение / освобождение памяти выполняется new и delete.

В C ++ есть несколько решений для автоматического управления памятью , например:

  • Умные указатели.
  • RAII (получение ресурсов - инициализация)
  • Подсчет ссылок и циклические ссылки
  • ...

Но как мне сделать автоматическое управление памятью в C?

Есть ли какие-нибудь решения для АВТОМАТИЧЕСКОГО управления памятью в C?

Есть ли какие-либо рекомендации или что-то подобное для C?

Хочу когда я забуду free блок памяти:

  • Мой код не компилируется

- или -

  • Память автоматически освобождается

И тогда я говорю: О, C лучше, чем C ++, Java и C #. : -)

Ответы [ 3 ]

12 голосов
/ 26 июля 2011

Вы можете использовать библиотеку сборщика мусора Boehm .

2 голосов
/ 28 февраля 2015

Поскольку ответил Juraj Blaho , вы можете использовать библиотеку сбора мусора, такую ​​как Boehm консервативный сборщик мусора , но есть и другие: Система пула памяти Ravenbrook , мой (необслуживаемый) QC GC , GC Мэтью Плантона и т. Д. *

И часто вы можете написать свой собственный сборщик мусора , специализированный для вашего случая использования. Вы можете использовать в C методы, упомянутые в вашем вопросе (умные указатели, подсчет ссылок), но вы также можете реализовать GC mark & ​​sweep или GC копирования.

Важной проблемой при кодировании GC является отслеживание локальных переменных-указателей (для сбора данных). Вы можете хранить их в локальном struct и связать их вместе.

Я настоятельно рекомендую прочитать больше о GC, например, Справочник по ГХ . Алгоритмы там полезны во многих ситуациях.

Вы даже можете настроить свой компилятор GCC (например, используя MELT ), чтобы добавить проверки или сгенерировать код (например, код для сканирования локальных переменных) для вашей конкретной реализации GC. Или вы можете использовать некоторый препроцессор (например, GPP ) для этого

На практике ГК Бёма часто достаточно хорош.

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

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

0 голосов
/ 22 января 2018

Для Linux я использую valgrind. Конечно, первоначальная причина, по которой был собран valgrind, заключалась в отладке вашего кода, но он делает намного больше. Он даже скажет вам, где потенциально ошибочный код может быть неинвазивным. Моя собственная команда выбора выглядит следующим образом.

# Install valgrind. Remove this line of code if you already have it installed
apt install valgrind
# Now, compile and valgrind the C
gcc main.c -Werror -fshort-enums -std=gnu11 -Og -g3 -dg -gdwarf-2 -rdynamic -o main
valgrind --quiet --leak-check=yes --tool=memcheck -Wall  ./main

Надеюсь, это поможет. ~ Счастливого кодирования!

...