C ++ - 分段错误,无需访问向量中的任何索引

时间:2014-06-29 11:26:21

标签: c++

我试图重载数组下标运算符并为[]运算符提供自定义异常处理机制。使用at()对向量进行索引,代码捕获异常,但随后崩溃成分段错误。

以下是示例代码

/* MySQLQueryResult.cpp */
class MySQLQueryResult : public mysqlpp::StoreQueryResult  {

         ...

         const mysqlpp::Row& MySQLQueryResult::operator[]( int index ) const
        {

            try {
                std::cout << " Called Array Subscript " << this->size( ) << std::endl ;
                if ( this->size() > 0 && this->size() > index ) {
                    return this->at( index ) ;
                } else {
                    throw std::out_of_range("Index out of range");
                }
            } catch ( std::exception& excpn_ob ) {
                std::cout << " Exception caught : " << excpn_ob.what( ) << std::endl ;
            }



        }

               ...  


}



/* QueryRow.cpp */
class QueryRow : public mysqlpp::Row {
   const mysqlpp::String& QueryRow::operator[]( int index ) const
        {

            try {
                std::cout << " Called Array Subscript In Row :  " << this->size( ) << "  " << std::endl ;
                std::cout << index << std::endl;
                if ( this->size() > 0 && this->size() > index ) {
                    return this->at( index ) ;
                } else {
                    throw std::out_of_range("Index out of range");  
                }
            } catch ( std::exception& excpn_ob ) {

                std::cout << " Exception caught : " << excpn_ob.what( ) << std::endl ;
            }


        }
}

    /* main.cpp */
    int main() {
    MySQLQueryResult res = getConfirmationData( ( string ) row.at( 0 ) ) ;

    QueryRow qm = res[0];

    cout << qm[2] << endl ; // this prints "Bill Watson"
    cout << qm[10] << endl; // this prints "Exception caught : Index out of range" and then gives a Seg fault and crashes

   mysqlpp::String srt = qm[10];  // this prints "Exception caught : Index out of range" and then gives a Seg fault and crashes
    }

所以我得到了两个节目消息&#34;被称为数组下标&#34; &#34;在行中调用数组下标&#34;但随后它捕获异常然后崩溃。我特意使用at()来捕获这种超出范围的异常,并防止程序崩溃作为一个长期运行的代码。  但在这里,esp在QueryRow::operator[]它捕获异常然后崩溃。我该如何避免这种Seg故障。请让我知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

我认为分段错误是因为你正在为cout使用返回值qm[10],但是当捕获到异常时,你不会返回任何内容。只需拨打qm[10]而不打印它就可以正常运行。