繁体   English   中英

为什么在 object `ins` 超出 scope 之后,`std::function` 对象(即 `fn`)仍然可以正常工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM