【问题标题】:'this' pointer changes in c++11 lambda'this' 指针在 c++11 lambda 中的变化
【发布时间】:2016-06-19 12:11:42
【问题描述】:

我在 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();
}

代码在不同的位置打印三个 this(s) 指针。我原以为所有三个 this 指针都应该是相同的值,但事实并非如此。这是输出:

this in constructor: 00F3FABB
something
this in signal: 00F3FABB
this in start: 00F3FB00
something

问题一:为什么this in start 的值不同?如何纠正?

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

【问题讨论】:

  • 您正在通过引用捕获 this 指针
  • @JustSid: thisalways captured by value,即使是 [&amp;]
  • @sth 哈!你知道的越多,谢谢:)

标签: pointers c++11 lambda


【解决方案1】:

您通过引用捕获start,但变量start 和包含的lambda 函数在out() 的末尾被销毁。

稍后信号处理程序尝试调用start(),但 lambda 函数不再存在。可能它的this所在的内存同时被覆盖了,导致了意外的输出。

尽管this 无效,但对print_something() 的调用不会崩溃,因为该函数实际上并未尝试使用this。函数中的打印与this 无关,print_somethings 地址的查找可以在编译时进行,这样调用函数就不会在运行时访问this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 2012-10-28
    • 1970-01-01
    • 2021-12-25
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多