[访问 我以前可以访问的功能时出现段错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[访问 我以前可以访问的功能时出现段错误相关的知识,希望对你有一定的参考价值。

我正在尝试使用一个函数来检查条件,但是尽管起初我可以访问它,但是经过几次迭代后,我遇到了分段错误。我包括一些WriteLogs来查看函数的返回值。

这是我能够使用该功能的四次之一:

[Fri Jan 10 12:40:25:889]: [INFO][RouteInfoManager::UpdateRouteStatus] Driving Mode 2 passengers 0
[Fri Jan 10 12:40:25:889]: [INFO][RouteInfoManager::UpdateRouteStatus] IsAsva 1
[Fri Jan 10 12:40:26:060]: [INFO][DatasetParam::Int] DatasetParam_TypeException, setting speaker_gain
[Fri Jan 10 12:40:26:063]: [INFO][DatasetParam::Int] DatasetParam_TypeException, setting speaker_gain
[Fri Jan 10 12:40:26:175]: [INFO][DatasetParam::Str] DatasetParam_TypeException, setting cpu_version

并且,这是分段错误错误:

[Fri Jan 10 12:40:26:901]: [INFO][RouteInfoManager::UpdateRouteStatus] Driving Mode 2 passengers 0
[Thread 0xaa3ebb40 (LWP 27594) exited]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xa0f49b40 (LWP 27661)]
0x086d0273 in AlstomMP14::RouteInfoManager::UpdateRouteStatus (this=0x90889e8) at ../src/route/RouteInfoManager.cpp:283
283     WriteLog("[RouteInfoManager::UpdateRouteStatus] IsAsva %d", audioInfoProvider->IsAsvaAuthorisedInTrainCA());

这些是WriteLogs:

WriteLog("[RouteInfoManager::UpdateRouteStatus] Driving Mode %d passengers %d", trainDataProvider->GetDrivingMode(), trainDataProvider->GetDrivingMode() != DRIVING_MODE_AUTOMATIC
         || trainDataProvider->IsTrainWithoutPassengers());

WriteLog("[RouteInfoManager::UpdateRouteStatus] IsAsva %d", audioInfoProvider->IsAsvaAuthorisedInTrainCA());

以及这些涉及的功能:

bool AudioManager::IsAsvaAuthorisedInTrainCA() 
    /// 1) Return true if train CA is without passengers and driving mode is automatic.
    return (!IsTrainCAWithoutPassengers() && trainDataProvider->GetDrivingMode() == DRIVING_MODE_AUTOMATIC);


bool AudioManager::IsTrainCAWithoutPassengers() 
    /// 1) Return true if driving mode is not automatic and train is without passengers.
    return (trainDataProvider->GetDrivingMode() != DRIVING_MODE_AUTOMATIC
            || trainDataProvider->IsTrainWithoutPassengers());

您可以看到WriteLogs显示IsTrainCAWithoutPassengers()函数的返回,这是IsAsvaAuthorisedInTrainCA()函数的条件之一。

我不明白为什么,每次(2和0)的取值都相同,有时我可以访问IsAsvaAuthorisedInTrainCA(),有时我会遇到分段错误。

答案
WriteLog("[RouteInfoManager::UpdateRouteStatus] IsAsva %d", audioInfoProvider->IsAsvaAuthorisedInTrainCA());

假设WriteLog的工作方式类似于printf(或转发到printf,则格式说明符与参数不匹配。

[%d代表int,而不是bool

您的程序有未定义的行为。

粘贴到int

以上是关于[访问 我以前可以访问的功能时出现段错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试访问向量中对象中的字段时出现段错误

初始化数组时出现段错误

访问嵌套结构时出现段错误

C ++:访问unordered_map中的数据时出现段错误以设置

关闭文件时出现段错误

删除对象时出现段错误 - GDB 在 free() 中说