Я хотел сделать специальную версию shared_ptr
, которая выполняла бы определенные операции, когда она была создана или уничтожена, но мои планы, похоже, были сорваны реализацией того, что деструктор shared_ptr
не является виртуальный, то есть когда я переопределяю его, мои указатели никогда не очищаются, когда последний экземпляр их уничтожается.Почему у shared_ptr нет виртуального дескриптора? (и как я могу обойти это?)
Единственной альтернативой, которая приходит на ум, является построение этого поведения в каждом классе, который я хочу использовать с моим гипотетическим пользовательским shared_ptr
, и это невозможно (или возможно в некоторых случаях).
Edit:
Причины, я хочу это, потому что я хочу использовать некоторые классы как USERDATA объектов в Lua, и я хочу, чтобы каждый из моих объектов, которые я использую этот способ иметь таблицу fenv уникальную для него который будет очищен, когда все ссылки на объект будут удалены. Я планирую использовать адрес указателя, когда они входят в таблицу, содержащую таблицу fenv.
Допустим, у меня есть виджет, который может иметь другие виджеты в качестве детей. Я создаю два виджета в Lua, затем устанавливаю его как дочерний элемент другого и удаляю все ссылки lua на дочерний виджет (тот факт, что он является дочерним, обрабатывается на C++). Теперь GC может работать в любое время и удалять ребенка. Я не обязательно хочу, чтобы у ребенка был его деструктор, хотя я хочу сделать его shared_ptr. Таким образом, объекты C++ все еще могут использовать его после того, как Lua очистит его. Если я присвоил значения или функции этому файлу, я все равно хочу иметь к ним доступ. Только когда окончательная ссылка на мой дочерний виджет будет удалена, я хочу, чтобы fenv был удален полностью.
Вы можете рассказать нам, что вы намерены делать по специализации 'shared_ptr'? Может быть, есть альтернативные подходы. – Naveen
Как обычно, скажите нам цель не за шагом. Он не имеет виртуального деструктора, потому что он не предназначен для базового класса. – GManNickG
Обновлен вопрос по причине, по которой я хочу это сделать. – Alex