使用已删除 shared_ptr 中的原始指针的未定义行为?
undefined behaviour to use raw pointer from a deleted shared_ptr?
我有以下代码
#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
将指向已删除的数据,你确实会有 未定义的行为。
我有以下代码
#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
将指向已删除的数据,你确实会有 未定义的行为。