Нет смысла менять свой дизайн выше с shared_ptr на weak_ptr.Право владения заключается не в использовании слабых_портров, а в том, чтобы управлять тем, кто хранит разделяемый_птр в течение значительного периода времени.Если я передам метод shared_ptr методу, при условии, что я не храню этот файл shared_ptr в поле моего объекта как части этого метода, я не изменил, кому принадлежат эти данные.
По моему опыту,причина для использования слабого_птр заключается в том, что у вас обязательно должен быть цикл указателей, и вам нужно разорвать этот цикл.Но сначала вы должны подумать, можете ли вы изменить свой дизайн, чтобы исключить цикл.
Я обычно не рекомендую смешивать shared_ptr и необработанные указатели.Неизбежно случается (хотя, вероятно, не должно), что необработанный указатель должен быть передан функции, которая принимает shared_ptr этого типа.Слабый_птр может быть безопасно преобразован в shared_ptr, с необработанным указателем вам не повезло.Хуже того, разработчик, не имеющий опыта в shared_ptr, может создать новый shared_ptr из этого необработанного указателя и передать его функции, в результате чего этот указатель будет удален при возврате функции.(Я действительно должен был исправить эту ошибку в рабочем коде, так что да, это случается :))