'this'指针在c ++ 11 lambda中发生变化

aj3*_*423 6 lambda pointers c++11

我在c ++ 11的lambda中发现了一个非常奇怪的问题.

#include <string>
#include <iostream>
using namespace std;

#include <boost/signals2.hpp>

boost::signals2::signal<void()> sig;

struct out {
    void print_something() {
        cout << "something" << endl;
    }
    out() {
        auto start = [&] {
            cout << "this in start: " << this << endl;
            this->print_something();
        };

        cout << "this in constructor: " << this << endl;

        // sig.connect(start);
        sig.connect([&] {
            cout << "this in signal: " << this << endl;
            start();
        });
        this->print_something();
    }
};

int main() {
    out o;
    sig();
}
Run Code Online (Sandbox Code Playgroud)

代码在不同位置打印三个this(s)指针.我期待所有三个这个指针应该是相同的值,但它们不是.这是输出:

this in constructor: 00F3FABB
something
this in signal: 00F3FABB
this in start: 00F3FB00
something
Run Code Online (Sandbox Code Playgroud)

问题1:为什么this in start有不同的价值?怎么纠正呢?

问题2:由于它this in start是一个不同的指针,它不应该能够调用print_something().我希望这会崩溃,但它运作正常.为什么?

sth*_*sth 5

start通过引用捕获,但变量start和包含的lambda函数在结束时被销毁out().

稍后信号处理程序尝试调用start(),但lambda函数不再存在.也许存储它的存储器this被同时覆盖,导致意外输出.

print_something()尽管this由于函数实际上没有尝试使用,但调用不会崩溃this.函数中的打印是独立的,this并且print_somethings地址的查找可以在编译时发生,因此调用函数不会this在运行时访问.