5

私は、メモリ不足の状況を適切に処理する必要があるメモリ集約型アプリケーションに取り組んでいます。

私は次のようなものを持っています

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::function には非スロー演算子が含まれています.おそらく何かが欠けていますが、この(ラムダ)状況で使用されているものはどれですか?

4

2 に答える 2

4

閉鎖はどこで作成されますか?

ラムダ式は、通常のファンクター クラスである名前のない型のオブジェクトを作成します。キャプチャされた変数は、その名前のない型のメンバーです。

コードmemory_manager::create_slot(100, [&dat](slot& sx) { sx.assign_data(dat); });は基本的に次と同じです。

slot_data_to_copy dat;

struct unnamed_lambda_type {
  slot_data_to_copy &dat;

  unnamed_lambda_type(slot_data_to_copy &dat_) : dat(dat_) {}

  void operator() (slot &sx) const {
    sx.assign_data(dat);
  }
};

memory_manager::create_slot(100, unnamed_lambda_type(dat) );

閉鎖はどこで作成されますか?

クロージャー オブジェクトは、他の一時オブジェクトと同様に、通常はスタックに割り当てられます。

于 2013-10-09T19:34:28.523 に答える
1

クロージャーラムダです。キャプチャされた変数は、無名構造体のデータ メンバーです (これがラムダです)。ラムダを作成してもスローできませんbad_alloc。あなたのエラーは他の場所にあります(おそらくstd::function、ラムダをヒープにコピーしている可能性のある を作成しています)。

補足:ラムダで参照によってキャプチャしています。slot_data_to_copy datラムダが呼び出されるまでに破棄されていないことを確認してください。値でコピーするか、ラムダをすぐに呼び出す必要があります。

于 2013-10-09T18:46:52.973 に答える