Неопределенное поведение, чтобы использовать необработанный указатель из удаленного 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", но ожидается ли это? или просто неопределенное поведение?
1 ответ
Решение
p_src
объект выходит из области видимости с закрывающей скобкой, и, поскольку нет другого экземпляра общего указателя, содержащийся в нем указатель будет удален. Так p_any
будет указывать на удаленные данные, и у вас действительно будет неопределенное поведение.