C++ 使用已删除共享\u ptr中的原始指针的未定义行为?

C++ 使用已删除共享\u ptr中的原始指针的未定义行为?,c++,pointers,shared-ptr,undefined-behavior,invalid-pointer,C++,Pointers,Shared Ptr,Undefined Behavior,Invalid Pointer,我有以下代码 #include <iostream> #include <memory> #include <cassert> int main() { void* p_any = nullptr; { auto p_src = std::make_shared<int>(10); // new instance p_any = p_src.get();

我有以下代码

#include <iostream>
#include <memory>
#include <cassert>

int main()
{
    void* p_any = nullptr;

    {
        auto  p_src = std::make_shared<int>(10); // new instance        
        p_any = p_src.get();                     // get raw unmanaged pointer?
        auto  p_again = reinterpret_cast<int*>(p_any);
        assert(*p_src == *p_again);
    }

    auto  p_again = reinterpret_cast<int*>(p_any); // ??
    std::cout << *p_again <<  "\n";                // undefined?, expected?

}
#包括
#包括
#包括
int main()
{
void*p_any=nullptr;
{
auto p_src=std::make_shared(10);//新实例
p_any=p_src.get();//获取原始非托管指针?
再次自动p_=重新解释p_铸造(p_any);
断言(*p_src==*p_再次);
}
再次自动p_=重新解释(p_any);/??

std::coutp\u src
对象与右大括号一起超出范围,并且由于没有其他共享指针实例,所包含的指针将被删除。因此
p\u any
将指向已删除的数据,您将确实具有未定义的行为。
p\u src
对象与右大括号一起超出范围,一个d由于没有其他共享指针实例,所包含的指针将被删除。因此
p_any
将指向已删除的数据,并且您确实会有未定义的行为。

assert(*p_src=*p_)
-你确定这里不应该是
==
吗?修复了打字错误,谢谢你不能将指针反引用到不存在的对象,所以不,不安全。是的,它是UB。指针已被删除;对它的反引用是UB。
不能
断言(*p\u src=*p\u)
-您确定它不应该在这里吗?
==已修复打字错误,谢谢您无法取消对不存在对象的引用指针,因此不,不安全。是的,它是UB。指针已被删除;取消对它的引用是UB。
无法