#include <functional>
#include <iostream>
struct FData
{
int id = 1;
int x = 5;
};
std::function<void()> test(const FData& in)
{
return [copy = in]()
{
std::cout << "addr=" << © << " id=" << copy.id << " x=" << copy.x << std::endl;
};
}
int main()
{
std::function<void()> callback;
{//scoped to destroy obj1
FData obj1;
std::cout << "addr=" << &obj1 << " id=" << obj1.id << " x=" << obj1.x << std::endl;
callback = test(obj1);
}
{
FData obj2;
//attempt to overwrite obj1 memory
obj2.id = 2;
obj2.x = 7;
std::cout << "addr=" << &obj2 << " id=" << obj2.id << " x=" << obj2.x << std::endl;
callback();
}
return 0;
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnN0cnVjdCBGRGF0YQp7CiAgICBpbnQgaWQgPSAxOwogICAgaW50IHggPSA1Owp9OwoKc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHRlc3QoY29uc3QgRkRhdGEmIGluKQp7CiAgICByZXR1cm4gW2NvcHkgPSBpbl0oKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiYWRkcj0iIDw8ICZjb3B5IDw8ICIgaWQ9IiA8PCBjb3B5LmlkIDw8ICIgeD0iIDw8IGNvcHkueCA8PCBzdGQ6OmVuZGw7CiAgICB9Owp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjYWxsYmFjazsKCiAgICB7Ly9zY29wZWQgdG8gZGVzdHJveSBvYmoxCiAgICAgICAgRkRhdGEgb2JqMTsKCiAgICAgICAgc3RkOjpjb3V0IDw8ICJhZGRyPSIgPDwgJm9iajEgPDwgIiBpZD0iIDw8IG9iajEuaWQgPDwgIiB4PSIgPDwgb2JqMS54IDw8IHN0ZDo6ZW5kbDsKCiAgICAgICAgY2FsbGJhY2sgPSB0ZXN0KG9iajEpOwogICAgfQoKICAgIHsKICAgICAgICBGRGF0YSBvYmoyOwogICAgICAgIC8vYXR0ZW1wdCB0byBvdmVyd3JpdGUgb2JqMSBtZW1vcnkKICAgICAgICBvYmoyLmlkID0gMjsKICAgICAgICBvYmoyLnggPSA3OwoKICAgICAgICBzdGQ6OmNvdXQgPDwgImFkZHI9IiA8PCAmb2JqMiA8PCAiIGlkPSIgPDwgb2JqMi5pZCA8PCAiIHg9IiA8PCBvYmoyLnggPDwgc3RkOjplbmRsOwoKICAgICAgICBjYWxsYmFjaygpOwogICAgfQoKICAgIHJldHVybiAwOwp9