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

时间:2013-10-09 18:41:07

标签: c++ c++11 lambda

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

我有类似

的东西
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包含nothrow运算符..我可能遗漏了一些东西,但是在这个(lambda)情况下使用了哪一个?

2 个答案:

答案 0 :(得分:4)

  

闭包在哪里创建?

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) );
  

闭包在哪里创建?

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

答案 1 :(得分:1)

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

旁注:你在lambda中通过引用捕获;确保在调用lambda时你的slot_data_to_copy dat没有被销毁。您应该按值复制或立即调用lambda。