[英]Why the `std::function` object(i.e `fn`) still works well after the object `ins` is out of scope?
为什么在 object ins
超出 scope 之后std::function
对象(即fn
)仍然可以正常工作? 这是代码快照( https://godbolt.org/z/Y6KaWY ):
#include <iostream>
#include <functional>
std::function<int(void)> fn;
class CTest
{
public:
CTest() {std::cout << "ctor:" << this << std::endl;};
int demo(void){std::cout << "this pointer:" << this << std::endl; return 0;}
};
void assign(void)
{
CTest ins;
fn = std::bind(&CTest::demo, &ins);
}
int foo()
{
return 9;
}
int main()
{
assign();
CTest tes1;
foo();
fn();
}
输出:
Program returned: 0
Program stdout
ctor:0x7fff64960a80
ctor:0x7fff64960be0
this pointer:0x7fff64960a80 //You see, still point to the object(i.e `ins`) that is out of its scope
class CTest
没有数据成员,也没有虚拟方法。 当您使用std::bind
捕获其地址 ( &ins
) 时,您将其存储在分配给全局变量fn
的实例中。 当您通过fn
执行CTest::demo()
时,您将捕获的指针作为第一个参数 ( this
) 传递给方法demo()
)。 您没有访问 class CTest
的任何成员。 这都是有效的。 但是由于您不知道fn
的用户将如何处理存储的指针,这将在assign()
结束时变得无效,这被归类为未定义的行为。
如果您将成员添加到CTest
并尝试从CTest::demo()
访问它们,那么您将访问this
指针指向的 memory,但 memory 不再有效并且可能已被覆盖。
如果你添加一个虚方法并尝试从CTest::demo()
执行它,或者即使你使CTest::demo()
成为虚方法,你很可能会调用无效函数,因为指向虚方法表的指针是捕获的指针指向的 memory 可能已被覆盖。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.