在没有活动异常的情况下调用终止(引发捕获所有表达式)

时间:2018-11-20 02:48:29

标签: c++ exception-handling

我有一个这样的代码块:

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的建议更正代码,该错误仍然会发生。

2 个答案:

答案 0 :(得分:0)

我认为信息

  

在没有活动异常的情况下终止调用

实际上是指

  

在没有活动C ++异常的情况下调用终止

terminate()可能由于多种不同的原因而被调用,不仅限于未处理的C ++异常。 catch (...)子句仅捕获C ++异常。在您的特定情况下,由于未处理的非C ++异常(例如一些应使用捕获的低级Windows异常),可能直接在terminate()allocate_memory()中或在运行时调用clone() SEH)。无论哪种情况,都不会输入catch块。

答案 1 :(得分:-1)

您已经从捕获中调用掷出,但是捕获应该捕获了。如果我正确理解的话,应该尝试一下。