从已删除的shared_ptr中使用原始指针的未定义行为?

时间:2017-02-02 07:06:40

标签: 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();                     // 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?

}

最后两个陈述是否安全?

我可以运行http://cpp.sh/6poh并输出“10”, 但是有望吗?或只是一个未定义的行为?

1 个答案:

答案 0 :(得分:4)

p_src对象超出了大括号的范围,并且由于没有其他共享指针实例,所以包含的指针将被删除。因此p_any将指向已删除的数据,您确实会有未定义的行为