Я думаю, что есть большой риск в использовании общих указателей. В основном вы потеряете контроль над реальным жизненным циклом указателей на объекты, которые содержат необработанные указатели, и в местах, которые сложнее найти и отладить, будут возникать ошибки.
Тогда вы говорите
просто указатель, который становится NULL при удалении из любой части программы.
Разве вы не видите противоречие?
Вы не хотите использовать разделяемый указатель, поскольку время жизни объектов определяется во время выполнения. Пока все хорошо.
Однако вам нужен указатель, который автоматически становится нулевым, когда владелец удаляет его. Проблема в том, что если время жизни вашего указателя известно, вам это вообще не нужно! Если вы знаете, когда заканчивается срок действия вашего указателя, тогда вы сможете удалить все экземпляры этого указателя, а также иметь возможность проверить, не мертв ли указатель.
Если у вас есть указатель, который вы не знаете, когда владелец освободит его, и у вас нет возможности проверить или не заметить побочный эффект для точки зрения слабого владельца, то действительно ли вы контролируете время жизни ваш указатель? Не совсем.
Фактически, ваша реализация опирается на общий указатель. Это поучительно в том смысле, что вам нужна некоторая форма совместного владения для реализации необработанного указателя, который может иметь слабый указатель на него. Затем, если вам нужно общее владение для реализации необработанного указателя со слабыми ссылками, у вас останется общий указатель. Вот почему существование предложенного вами класса противоречиво.
std::shared_ptr
+ std::weak_ptr
предназначен для решения проблемы «части вашей программы не знают, когда владелец освободит ресурс». Что вам нужно, это один std::shared_ptr
и несколько std::weak_ptr
, чтобы они знали, когда ресурс освобожден. Эти классы имеют информацию, необходимую для проверки времени жизни переменной во время выполнения.
Или, если, наоборот, вы знаете время жизни ваших указателей, то используйте это знание и найдите способ убрать оборванные указатели, или найдите способ проверить на наличие повисших указателей.