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

标签 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”, 但这是预期的吗?或者只是一个未定义的行为?

最佳答案

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

关于c++ - 使用已删除的 shared_ptr 中的原始指针的未定义行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41996077/

相关文章:

c - 如何将 main 的 *argv[] 传递给函数?

c++ - 为什么 std::shared_ptr 提供 operator<<?

c++ - io_service,为什么以及如何使用它?

c++ - 可变参数宏中的模板推导失败

C++ 模板编译错误 - 递归类型或函数依赖

c++ - 编写时C++中的输入重定向问题

c - 将数组移交给函数。指针的正确使用?

c - Str[Col][Row] 中的 Str 是 "pointer"还是 "pointer to pointer"?

c++ - 了解 shared_ptr::void reset (U* p) 的异常安全;

c++ - 使用 std::tr1::shared_ptr 作为引用计数的内部机制