gpt4 book ai didi

pointers - C++11 lambda 中的“this”指针发生变化

转载 作者:行者123 更新时间:2023-12-02 21:34:26 24 4
gpt4 key购买 nike

我在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 in constructor: 00F3FABB
something
this in signal: 00F3FABB
this in start: 00F3FB00
something

问题1:为什么start中的this有不同的值?如何纠正?

问题2:由于start中的this是一个不同的指针,它不应该能够调用print_something()。我预计会发生崩溃,但它工作正常。为什么?

最佳答案

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

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

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

关于pointers - C++11 lambda 中的“this”指针发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37907097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com