Поскольку ответил Juraj Blaho , вы можете использовать библиотеку сбора мусора, такую как Boehm консервативный сборщик мусора , но есть и другие: Система пула памяти Ravenbrook , мой (необслуживаемый) QC GC , GC Мэтью Плантона и т. Д. *
И часто вы можете написать свой собственный сборщик мусора , специализированный для вашего случая использования. Вы можете использовать в C методы, упомянутые в вашем вопросе (умные указатели, подсчет ссылок), но вы также можете реализовать GC mark & sweep или GC копирования.
Важной проблемой при кодировании GC является отслеживание локальных переменных-указателей (для сбора данных). Вы можете хранить их в локальном struct
и связать их вместе.
Я настоятельно рекомендую прочитать больше о GC, например, Справочник по ГХ . Алгоритмы там полезны во многих ситуациях.
Вы даже можете настроить свой компилятор GCC (например, используя MELT ), чтобы добавить проверки или сгенерировать код (например, код для сканирования локальных переменных) для вашей конкретной реализации GC. Или вы можете использовать некоторый препроцессор (например, GPP ) для этого
На практике ГК Бёма часто достаточно хорош.
Обратите внимание, что живучесть некоторых данных является свойством всей программы. Поэтому лучше подумать о GC на самой ранней стадии разработки программного обеспечения.
Также обратите внимание, что надежное обнаружение утечек памяти с помощью статического анализа исходного кода в общем случае невозможно ( неразрешимо ), поскольку его можно доказать эквивалентным проблеме остановки .