相关疑难解决方法(0)

Google C++风格指南的无例外规则; STL?

谷歌的C++风格指南说"我们不使用例外".关于异常的使用,风格没有提到STL.由于STL分配器可能会失败,它们如何处理容器抛出的异常?

  1. 如果他们使用STL,调用者如何获知分配失败?像push_back()map或map operator[]这样的STL方法不会返回任何状态代码.
  2. 如果他们不使用STL,他们使用什么容器实现?

c++ stl exception

65
推荐指数
6
解决办法
2万
查看次数

gnu arm cortex m4上的C++异常处理程序,带有freertos

更新2016-12 此行为现​​在还有一个最小的示例:https://community.nxp.com/message/862676


我正在使用ARM Cortex M4和freertos使用freescales自由Kinetis IDE(gnu arm工具链).问题是

try {
    throw 4; // old scenario also not working: throw std::runtime_error("wut");
} catch (...) {
}
Run Code Online (Sandbox Code Playgroud)

在try处理程序之后导致暂停的CPU和代码,或者在catch处理程序中(当添加一些代码时)不会执行.

可以在这里找到汇编:https://gist.github.com/Superlokkus/3c4201893b4c51e154e2a0afdf78fef0

我认为这会导致SVC中断,我很抱歉我弄错了,Freertos欺骗了我,因为当我扔东西时它会在DefaultISR中停止.

throw indeeds跳转到 __cxa_throw然后从那里跳到___Unwind_RaiseException __gnu_Unwind_RaiseException __cxa_begin_catch> <_ZSt9terminatev> 所以它看起来像是std::terminate被调用,但是catch all块不应该允许这个.或者我的假设是错误的,这种行为是因为gcc C++运行时异常支持是一个总是调用终止的存根?!

更新2016-09:因为我看到rand()尝试使用malloc(),我还定义了一个工作的malloc()/ freeRTOS函数和etvoilà:__ cxa_allocate_exception使用malloc(我想知道工具链是如何期望我处理bad_alloc的情况).所以现在,它仍然崩溃,但在异常分配后(我认为):执行路径是:

(throwing function after exception allocation)
__cxa_throw
   ...                        //(some intructions in __cxa_throw)
   __cxa_begin_catch  //I guess something went wrong here
    _ZSt9terminatev // Immediately after __cxa_begin_catch
        _ZN10__cxxabiv111__terminateEPFvvE:
         00016dfc: push {r3, lr}
         00016dfe: blx r0  //Goes …
Run Code Online (Sandbox Code Playgroud)

c++ embedded arm freertos cortex-m

12
推荐指数
3
解决办法
1653
查看次数

标签 统计

c++ ×2

arm ×1

cortex-m ×1

embedded ×1

exception ×1

freertos ×1

stl ×1