неопределенное поведение, чтобы использовать необработанный указатель из удаленного 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»,
но ожидается ли это? или просто неопределенное поведение?

0

Решение

p_src объект выходит из области видимости с закрывающей скобкой, и, поскольку нет другого экземпляра общего указателя, содержащийся в нем указатель будет удален. Так p_any будет указывать на удаленные данные, и вы действительно будете иметь неопределенное поведение.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]