shared_ptr
управляет владением ресурсами.Когда вы передаете ему указатель, вы фактически говорите: «Это ваше.Убедитесь, что вы утилизируете его, когда выйдете из области видимости. ” 1
Но затем вы передаете ему указатель, который не должен утилизироваться, поскольку он указывает на объект с автоматическим хранением.Это не работаетИспользуйте shared_ptr
только для указателей, которые были созданы с использованием new
. 2
Как следствие, shared_ptr
пытается delete
ресурс, который не былnew
ред.Это вызывает ошибку, которую вы наблюдаете.
1 Это упрощение.Фактически, shared_ptr
управляет общим владением (= общим с другими shared_ptr
экземплярами);это означает, что ресурс будет утилизирован только один раз , все , владеющие shared_ptr
s, выйдут из области видимости.
2 Также упрощение: есть другие способычем new
получения ресурсов, которыми нужно управлять, но затем вам нужно указать shared_ptr
, как управлять ресурсом.Действие по умолчанию - delete
, которое работает только на new
ed ресурсах.