2016-06-19 106 views
6

我在C++ 11的lambda中發現了一個非常奇怪的問題。'this'pointer in 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 in constructor: 00F3FABB 
something 
this in signal: 00F3FABB 
this in start: 00F3FB00 
something 

問題1:爲什麼this in start有不同的價值?如何糾正?

問題2:由於this in start是不同的指針,因此它不應該能夠調用print_something()。我期望在這個崩潰,但它工作正常。爲什麼?

+0

您正在通過引用 – JustSid

+2

捕獲這個指針@JustSid:'this' [總是通過值捕獲](https://stackoverflow.com/q/16323032/56338),即使使用'[&]'。 – sth

+0

@sth哈!你知道的越多,謝謝:) – JustSid

回答

5

您通過引用捕獲start,但變量start和包含的lambda函數在out()的末尾被銷燬。

後來信號處理程序試圖調用start(),但lambda函數不再存在。也許其存儲的this存儲在同一時間被覆蓋,導致意想不到的輸出。

即使this無效,對print_something()的調用也不會崩潰,因爲該函數實際上並未嘗試使用this。函數中的打印與this無關,查找print_something的地址可能在編譯時發生,因此調用該函數在運行時不會訪問this