我有一个这样的代码块:
namespace bi = boost::intrusive;
struct Container {
struct Item {
bi::set_member_hook<> link;
int x;
};
struct Cmp {
bool opeartor()(Item const& it1, Item const &it2) const {
return it1.x < it2.x;
}
};
using Set = typename bi::set<Item,
bi::member_hook<Item, bi::set_member_hook<>, &Item::link>,
bi::compare<Cmp>,
bi::constant_time_size<false>
>;
Container(Container const& o) {
auto cloner = [](const Item &x) {
return current_allocator().construct<Item>(x);
};
with_allocator(_alloctor, [&] {
new (&_data) Set;
_data.clone_from(o._data, cloner, current_deleter<Item>());
}
}
private:
Set _data;
};
程序有时终止,并显示以下消息:
在没有活动异常的情况下终止调用
我从stackoverflow找到了一个答案,该答案是由于throw
被调用而没有活动异常。但是,如果没有活动的异常,那么它将无法到达catch
块。
对不起我的英语不好
编辑:代码示例已更新。
编辑2:按照@:RemyLebeau的建议更正代码,该错误仍然会发生。
答案 0 :(得分:0)
我认为信息
在没有活动异常的情况下终止调用
实际上是指
在没有活动C ++异常的情况下调用终止
terminate()
可能由于多种不同的原因而被调用,不仅限于未处理的C ++异常。 catch (...)
子句仅捕获C ++异常。在您的特定情况下,由于未处理的非C ++异常(例如一些应使用捕获的低级Windows异常),可能直接在terminate()
或allocate_memory()
中或在运行时调用clone()
SEH)。无论哪种情况,都不会输入catch块。
答案 1 :(得分:-1)
您已经从捕获中调用掷出,但是捕获应该捕获了。如果我正确理解的话,应该尝试一下。