闭包捕获的变量存储在哪里?
Where are the closure's captured variables stored?
我正在开发内存密集型应用程序,应该可以正确处理内存不足的情况。
我有类似的东西
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。
- 谷歌测试中的期望值存储在哪里
- 常量参数存储在哪里 (C++)?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 模板参数在 C++ 中存储在哪里?
- C++ - thread_local变量存储在哪里?
- 返回值存储在哪里?
- glVertexAttribDivisor 存储在哪里 - VAO、VBO 或全局状态?
- 虚拟函数在哪里使用 vpointer to vtable 来解析方法调用,非虚拟方法存储在哪里以及如何解析它们?
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- C++ - 函数中的局部指针变量具有什么类型的存储持续时间以及它们存储在哪里?
- bazel 项目将其".so"文件存储在哪里?
- 返回对象存储在哪里
- OpenSSL dll文件存储在哪里
- 如果我在我的函数中返回一个类,它存储在哪里
- 变量名称存储在哪里
- 引用变量存储在哪里
- 数组的指针,该数组的每个元素的内存空间信息存储在哪里
- 常量数据存储在哪里
- 编译时局部变量存储在哪里