我正在开发一款内存密集型的应用程序,需要能够正确处理内存不足的情况。
我有类似以下的代码
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); });
我假设在捕获变量时执行了 throw 操作。(实际上,我捕获了更多变量,这只是一个示例)
闭包是在哪里创建的? 我能控制它吗?或者,如果我以一种接受参数的方式更新管理器,例如
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)情况下使用哪一个?
std::function
зҡ„жһ„йҖ еҮҪж•°жҳҜtemplate< class F > function( F f );
пјҢе®ғдёҚжҳҜnoexcept
гҖӮ - dyp