我正在處理內存密集型應用程序,它應該正確處理內存不足的情況。關閉的捕獲變量存儲在哪裏?
我有類似
class memory_manager {
// returns true if slot created (and function is being run)
// false otherwise
static bool create_slot(int id, std::function<void (slot&)>); ........
}
此類處理,日誌,等等所有的內存外的問題,保持所有插槽的所有權和驅動器並行。
不過,我有未處理的std::bad_alloc
在下面的代碼:
slot_data_to_copy dat;
memory_manager::create_slot(100, [&dat](slot& sx) { sx.assign_data(dat); });
我認爲扔在捕捉變量期間完成。 (我其實捕獲了更多,這只是一個示例)
閉包創建在哪裏? 我可以控制它嗎?或者,如果我以一種需要參數的方式更新管理器,如
slot_data_to_copy dat;
memory_manager::create_slot<slot_data_to_copy>
(100, dat, [](slot& sx, slot_data_to_copy& dat)
{ sx.assign_data(dat); }
);
是否保證它不會丟棄?我正在編譯使用Windows上的Visual C++和Linux上的GCC,但我只在Windows上觀察到這種行爲(在Linux上,我可能在內存不足的地方可能會處理它)。
編輯:
http://en.cppreference.com/w/cpp/utility/functional/function/function - 的std ::函數包含拋出異常商..我可能失去了一些東西,但哪一個是這個(拉姆達)情況下使用?
'我假設在捕獲變量的過程中完成了拋出。 ' - lambda被複制到堆上?什麼時候發佈? – nothrow
[expr.prim。lambda表達式的評估導致臨時值,該臨時值稱爲*閉包對象*。這裏使用的'std :: function'的ctor是'template < class F >函數(F f);',它*不是*'noexcept'。 – dyp