Помещение указателя в shared_ptr
передает владение указателем на shared_ptr, поэтому shared_ptr
отвечает за его удаление.Это концептуально важная операция, поэтому дизайнеры shared_ptr
не хотели, чтобы это происходило как часть обычного задания.Например, они хотели предотвратить такой код:
some_shared_ptr = some_other_smart_pointer.get();
, который выглядит довольно безобидным, но означал бы, что оба умных указателя считали, что несут ответственность за очистку указателя, и, вероятно, дважды удалят указательчто-то похожее.
Вот что происходит с вашим утверждением об отладке.Вызов SetNextPtr(&lis)
передает владение &lis
на shared_ptr
, а «владение» означает, что shared_ptr
будет вызывать delete
для своего коммутатора, когда последняя копия shared_ptr
выйдет из области видимости.Таким образом, вы фактически удаляете локальную (стековую) переменную - lis
- которая разрушает стек и вызывает сбой.