我遇到了有关例外的问题。
代码如下所示,
try
{
auto it = set_difference(allInterfaces.begin(), allInterfaces.end(), eths.begin(),
eths.end(), newCards.begin());
}
catch(...)
{
cout << "exception thrown << endl;
}
我知道set_difference()抛出一个异常,但是程序退出并且catch块没有捕获异常。有没有办法捕捉异常?我认为这一切都应该永远有效。
感谢您的帮助。
答案 0 :(得分:2)
set_difference
会将输入集中唯一的元素写入您传入的输出范围。您有责任确保该范围足够大以包含结果。否则,您将超出范围的范围,导致未定义的行为。发生这种情况时不会抛出任何异常,您可以预期的最佳指标是未经优化的构建中的断言失败(并且也无法保证)。
假设newCards
是支持push_back
的容器,最简单的方法是使用std::back_insert_iterator
,每次分配一个对象时都会调用push_back
它
auto it = set_difference(allInterfaces.begin(), allInterfaces.end(),
eths.begin(), eths.end(), std::back_inserter(newCards));
其他可用选项包括std::front_insert_iterator
(来电push_front()
)和std::insert_iterator
(来电insert()
)。选择最适合您需求的那个。
答案 1 :(得分:1)
在你的评论的帮助下,你很可能增加并迭代从newCards.begin()
返回的迭代器,甚至超出了向量的范围。这导致undefined behavior(在您的情况下导致崩溃)而不是抛出C ++异常。迭代器访问没有在C ++中进行边界检查(很少有东西)。
要解决此问题,您还需要传递newCards
向量的末尾,并确保不会超出范围。