C++ 闭包在哪里';存储了哪些捕获的变量?

C++ 闭包在哪里';存储了哪些捕获的变量?,c++,c++11,lambda,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&)>); ........ } 我假设抛出是在捕获变量的过程中

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

我有点像

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&)>); ........
}
我假设抛出是在捕获变量的过程中完成的。(我实际上捕获了更多,这只是一个示例)

在哪里创建闭包? 我能控制它吗?或者,如果我以接受参数的方式更新管理器,比如

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); }
       );
slot\u data\u to\u copy dat;
内存\u管理器::创建\u插槽
(100,dat,[](插槽和sx,插槽数据到副本和dat)
{sx.assign_data(dat);}
);
能保证它不会扔吗

我在Windows上使用VisualC++和Linux上的GCC编译,但我只在Windows上观察到这种行为(Linux上,内存耗尽,可能是我能处理它的地方)。 编辑:

-std::函数不包含任何行运算符。。我可能遗漏了一些东西,但是在这种(lambda)情况下使用了哪一个呢?

闭包是lambda;捕获的变量是匿名结构的数据成员(这就是lambda)。创建lambda时不能抛出
错误的alloc
;您的错误在别处(可能是创建
std::function
,这可能是将lambda复制到堆中)

旁注:您正在lambda中通过引用进行捕获;确保在调用lambda时,您的
slot\u data\u to\u copy dat
未被销毁。您应该按值复制它或立即调用lambda

在哪里创建闭包

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

您的代码
内存管理器::创建_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) );
在哪里创建闭包


closure对象与任何其他临时对象一样,通常分配在堆栈上。

我假设抛出是在捕获变量期间完成的-lambda正在堆上复制?并且,何时发布?[expr.prim.lambda]/2“lambda表达式的计算结果是一个prvalue临时值。这个临时值被称为闭包对象。”这里使用的
std::function
的构造函数是
模板函数(F),它不是
noexcept
。好的,我假设抛出是在捕获变量时完成的(如果是在std::function创建中完成的,我不介意)。我想在堆栈上创建std::function,这可能吗?
std::function
正在作为参数传递,因此它已经在堆栈上了
std::function
内部有一个指向堆上lambda的指针(想想
std::vector
如何可以在堆栈上,但它的数据在堆上)。ad sidenote-函数create_slot不会将lambda保留在任何位置,因此数据不能被破坏
std::function
的构造函数接受分配器,这样你就可以控制它了。
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) );