私はメモリが豊富なアプリケーションで、メモリ不足の状況を適切に処理する必要があります。クロージャのキャプチャされた変数はどこに格納されていますか?
私は、
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では、おそらくどこかでメモリが不足します)。
EDIT:
http://en.cppreference.com/w/cpp/utility/functional/function/function - のstd ::機能は、オペレータnothrow含まれている..私はおそらく何かが欠けているんだけど、この(ラムダ)の状況で使用されている1?
'変数のキャプチャ中にスローが行われたと仮定します。 ' - ラムダがヒープ上にコピーされていますか?それはいつリリースされるのですか? – nothrow
[expr.prim。ラムダ式の評価結果は一時的にprvalueになります。この一時的なものは* closureオブジェクト*と呼ばれます。ここで使われている 'std :: function'のctorは' template以外の 'noexcept'である' template < class F > function(F f); 'です。 – dyp