Мне нужен указатель на объект стека, который может go выйти из области видимости. Мне сказали, что слабый указатель может достичь этого, но следующий код выдает ошибку сегмента:
#include <memory>
#include <cassert>
int main()
{
std::weak_ptr<int> wp;
{
auto a = 4;
wp = std::shared_ptr<int>(&a, [](auto){});
assert(*wp.lock().get() == 4);
}
assert(wp.lock().get() == nullptr);
return 0;
}
Почему это так?
edit
Я нашел решение, которое, кажется, работает.
std::weak_ptr<int> wp;
{
auto a = 4;
auto sp = std::shared_ptr<int>(&a, [](auto){});
wp = sp;
assert(*wp.lock().get() == 4);
}
assert(wp.lock().get() == nullptr);
Но комментатор сказал мне, что это неопределенное поведение. Почему это работает, и почему это UB?
edit2
Другой комментатор сказал, что это потому, что общий указатель остается в области видимости, но если это случай, почему это все еще работает?
std::weak_ptr<int> wp;
{
auto a = 4;
auto sp = std::shared_ptr<int>();
{
sp = std::shared_ptr<int>(&a, [](auto){});
wp = sp;
assert(*wp.lock().get() == 4);
} //shared pointer out of scope
assert(*wp.lock().get() == 4);
} // stack object out of scope
assert(wp.lock().get() == nullptr);