我正致力于内存密集型应用程序,它应该正确处理内存不足的情况.
我有类似的东西
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&)>); ........
}
Run Code Online (Sandbox Code Playgroud)
此类处理,记录等所有内存不足问题,保留所有插槽的所有权,并驱动并发.
但是,我没有处理std::bad_alloc以下代码:
slot_data_to_copy dat;
memory_manager::create_slot(100, [&dat](slot& sx) { sx.assign_data(dat); });
Run Code Online (Sandbox Code Playgroud)
我假设在捕获变量期间完成了抛出.(我实际捕获的更多,这只是一个示例)
封闭在哪里创建?我可以控制它吗?或者,如果我以一种带参数的方式更新管理器,比如
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); }
);
Run Code Online (Sandbox Code Playgroud)
是否保证它根本不投掷?
我正在使用Windows上的Visual C++和Linux上的GCC编译,但我只在Windows上观察到这种行为(在linux上,我的内存耗尽可能是我可以处理它的地方).
编辑:
http://en.cppreference.com/w/cpp/utility/functional/function/function - std :: function包含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) );
Run Code Online (Sandbox Code Playgroud)
闭包是在哪里创建的?
闭包对象就像任何其他临时对象一样,通常在堆栈上分配。