尝试catch无法处理pthread内部的分段错误

时间:2019-01-14 04:27:26

标签: c++ segmentation-fault pthreads try-catch

这里cdp是一个包含一些矢量的程序包。访问向量时会导致分割错误。 (我在仔细检查过的范围内访问了向量)。我计划使用try catch处理此异常,但是它不起作用。

根据gdb,以下行引起了问题。

int firing_crash=cdp->firing_data[0].size();

功能如下:

bool modified_simplex_solver::check_for_corrupt_cdp(converted_data_pack* cdp)
{
    try{
        int firing_crash=cdp->firing_data[0].size();
        int not_firing_crash=cdp->not_firing_data[0].size();
        return false;
    }
    catch(...)
    {   return true;}
}

2 个答案:

答案 0 :(得分:1)

如果向量在指定索引处没有元素,则可以使用operator[]成员函数来代替at()(不执行边界检查),并且会导致不确定的行为,而不是使用pos

at( size_type pos );

此功能:

  
      
  • 返回对指定位置pos处元素的引用,并进行边界检查

  •   
  • 如果std::out_of_range不在容器范围内,则会抛出类型为at()的异常

  •   

由于catch引发了异常,因此您可以int firing_crash=cdp->firing_data.at(0).size();

您的情况下的用法是:

for index in 0...100 {
    let urlString = "https://someurl.com/item/\(index)"
    guard let url = URL(string: urlString) else { return }
    requestPromises += [URLSession.shared.dataTask(.promise, with: url).validate()]
}

firstly {
    when(fulfilled: requestPromises)
}.done { results in
    // process results
}

答案 1 :(得分:0)

问题中的代码将异常用于流控制。那是Java的事情;在C ++中,它皱眉了。在C ++(以及Java中)中执行此操作的方法是检查数据是否存在:

return firing_data.empty() || not_firing_data.empty();