Я хотел создать специальную версию shared_ptr
, которая выполняла бы определенные операции, когда она была создана или уничтожена, но мои планы, похоже, были сорваны осознанием того, что деструктор shared_ptr
не виртуален, то есть когда я переопределите его, мои указатели никогда не будут очищены, когда последний экземпляр из них будет уничтожен.
Единственная альтернатива, которая приходит на ум, - встроить это поведение в каждый класс, который я хочу использовать с моим гипотетическим обычаем shared_ptr
, и это невозможно (или возможно в некоторых случаях).
Edit:
Причина, по которой я этого хочу, заключается в том, что я хочу использовать некоторые классы в качестве объектов пользовательских данных в lua, и я хочу, чтобы каждый из моих объектов, которые я использую таким образом, имел уникальную таблицу fenv, которая будет очищена, когда все ссылки на объект были удалены. Я планирую использовать адрес указателя при вводе ключа в таблицу, содержащую таблицу fenv.
Допустим, у меня есть виджет, который может иметь другие виджеты в качестве детей. Я создаю два виджета в Lua, затем устанавливаю один как дочерний для другого и удаляю все ссылки lua на дочерний виджет (факт, что это дочерний элемент, обрабатывается в C ++). GC теперь может работать в любое время и удалить ребенка. Я не обязательно хочу, чтобы у ребенка был запущен деструктор, поэтому я хочу сделать его shared_ptr. Таким образом, объекты C ++ могут все еще использовать его после того, как Lua очистил его. Если я назначил значения или функции для этого fenv, я все еще хочу иметь доступ к ним. Только после удаления окончательной ссылки на мой дочерний виджет я хочу полностью удалить таблицу fenv.