Концепция умных указателей - это основной метод управления памятью в C++. Будучи довольно-таки низкоуровневым языком, изначально он поддерживает лишь прямое управление памятью. Пусть и не напрямую через системные вызовы malloc/free как в Си, но программисту требуется самостоятельно следить за памятью, которую он выделяет.
Умные указатели служат обёрткой над сырыми указателями и берут на себя ответственность за их освобождение. Грубо говоря, они наблюдают количеством всех активных использований объекта и удаляют его, когда число всех референсов достигнет нуля. Подобную функцию выполняет и garbage collector в других языках, но уже для всех аллоцированных объектов сразу.
На чистом Си такой функционал полноценно реализовать сложно за неимением в языке полноценной системы дженериков, конструкторов и деструкторов для объектов.
В моей реализации практически точно воспроизведен концепт std::shared_ptr, который берет ответственность за всё написанное выше.
Каждый объект полагается на контрольный блок, хранящий в себе информацию о количестве текущий референсов данного умного указателя в атомарном виде - потокобезопасно и lock-free. Это не идеальное решение, поскольку атомарные операции сильно дороже обычных.
Этот счётчик в контрольном блоке увеличивается по мере создания новых экземпляров объекта и уменьшается по мере их удаления. Достигается это за счёт использования конструктора копирования, который создаёт новый экземпляр на основе предыдущего, и деструктора, уничтожающего результат.
Объект по указателю внутри уничтожается вместе с последним экземпляром shared pointer - иначе говоря, когда счётчик доходит до нуля.