Предположим, у меня есть следующий код:
#include <memory>
struct Foo{};
int main()
{
std::shared_ptr<Foo> pf = std::make_shared<Foo>();
delete pf.get();
//do anything else
return 0;
}
Почему я не могу использовать delete
для непосредственного удаления объекта Foo
? По моему мнению, проблема в том, что после разрушения умного указателя,delete
будет вызван дважды и приведет к неопределенному поведению. Но почему это вызывает ошибку при первом использовании вручную.Я запутался, пожалуйста, помогите мне.
И я обнаружил, что возвращение get()
в visual studio равно адресу выделения для реального объекта Foo
из new
.*
template<class... _Types>
explicit _Ref_count_obj(_Types&&... _Args)
: _Ref_count_base()
{ // construct from argument list
::new (static_cast<void *>(&_Storage)) _Ty(_STD forward<_Types>(_Args)...);
}