闭包捕获的变量存储在哪里?

Where are the closure's captured variables stored?

本文关键字:存储 在哪里 变量 闭包      更新时间:2023-10-16

我正在开发内存密集型应用程序,应该可以正确处理内存不足的情况。

我有类似的东西

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::函数包含 nothrow 运算符。我可能错过了一些东西,但是在这种(lambda(情况下使用哪一个?

关闭在哪里创建?

lambda 表达式创建一个未命名类型的对象,该对象只是一个普通的函子类。捕获的变量是该未命名类型的成员。

您的代码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) );

关闭在哪里创建?

闭包对象就像任何其他临时对象一样,通常在堆栈上分配。

闭包 lambda;捕获的变量是匿名结构的数据成员(这就是 lambda(。创建你的 lambda 不能抛出bad_alloc;您的错误在其他地方(可能创建了std::function,这可能是将lambda复制到堆上(。

旁注:您是通过 lambda 中的引用捕获的;请确保您的slot_data_to_copy dat在调用 lambda 时未被破坏。您应该按值复制它或立即调用 lambda。