我试图重载数组下标运算符并为[]
运算符提供自定义异常处理机制。使用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故障。请让我知道如何解决这个问题。
答案 0 :(得分:1)
我认为分段错误是因为你正在为cout使用返回值qm[10]
,但是当捕获到异常时,你不会返回任何内容。只需拨打qm[10]
而不打印它就可以正常运行。