我剛剛使用C++ 11/14 std :: thread對象編寫了一個線程池,並使用worker隊列中的任務。在lambda表達式中調用遞歸函數時遇到了一些奇怪的行爲。在std :: function中調用遞歸函數
#include <functional>
#include <vector>
std::size_t fac(std::size_t x) {
// This will crash (segfault).
// if (x == 1) return 1;
// else return fac(x-1)*x;
// This, however, works fine.
auto res = 1;
for (auto i = 2; i < x; ++i) {
res *= x;
}
return res;
}
int main() {
std::vector<std::function<void()> > functions;
for (auto i = 0; i < 10; ++i) {
functions.emplace_back([i]() { fac(i); });
}
for (auto& fn : functions) {
fn();
}
return 0;
}
它,然而,做工精細與上面的迭代版本:如果你在一個遞歸的方式(包括鏗鏘3.5和gcc 4.9)實現fac()
下面的代碼崩潰。我錯過了什麼?
,而您的最終狀態是'X == 1'是不是因爲你從0開始? – Jamboree 2014-12-08 01:33:22
重申你的最後一句話,如果「正常工作」的意思是「不會崩潰」,那麼你是正確的。如果它的意思是「給出正確的答案」,請參閱我的答案,爲什麼你可能想重新考慮這個陳述:-) – paxdiablo 2014-12-08 02:29:10