Отключить преобразование из std::weak_ptr в std::shared_ptr
Я знаю, что могу "продвигать" weak_ptr
в shared_ptr
как это:
// std::weak_ptr<T> weak;
std::shared_ptr<T> promoted(weak);
У меня вопрос: можно ли это как-то предотвратить?
В качестве упражнения я хотел создать собственную очень простую реализацию WeakPtrFactory. Инициируется с this
как член класса, а затем икру weak_ptr
s, которые будут признаны недействительными при уничтожении объекта. Моя попытка просто использовалась shared_ptr
как частный член и вернулся weak_ptr
s, созданные с его помощью (на всякий случай не передается операция удаления). Но у этого есть очевидный недостаток, так как каждый может просто продвинуть их назад к shared_ptr
и сломать весь механизм.
1 ответ
Следуя совету @user2357112 я завернул std::weak_ptr
внутренне создать std::shared_ptr
при необходимости и уничтожить его сразу после использования.
Я, наверное, должен уточнить, что я хотел добиться упрощенной версии этой концепции. Хотя это имеет похожее название это WeakPtr
имеет другой случай использования shared_ptr
один. Он используется для того, чтобы проверять не потокобезопасным способом, что какой-либо объект был / не был уничтожен, чтобы мы могли предпринять соответствующие действия. Программист обязан убедиться, что, если объект все еще жив, он может безопасно использовать его (например, путем проверки его существования и вызова его методов в том же потоке).