xMu*_*elx 4 c++ malloc gcc exception-handling exception
我在一个安全的嵌入式系统中工作,我想稍微修改一下异常处理。__cxa_allocate_exception使用malloc()为异常对象分配内存。malloc/new在安全应用程序中是不允许的,所以我必须重写它。
现在我的问题是:在这种情况下有没有办法避免 malloc?
一些替代方案是:
看看:(gcc-6.3.0/libstdc++-v3/libsupc++/eh_alloc.cc或更高版本)。一个pool(内存)类emergency_pool在匿名命名空间中被指定和实例化。你可以调整EMERGENCY宏值,或完全替换实现 - 只要您在使用池时考虑线程安全。
如果您事先了解调用堆栈深度,则可以为池缓冲区修复始终足够的值。同样,为了线程安全,您可能需要同步原语。
如果这还不够,则在分配失败时__cxa_allocate_exception调用std::terminate。在这里std::set_terminate可以为您提供挽救关键信息的最后机会。
为了线程安全,使用与__gnu_cxx::__mutex池相同的对象以及__gnu_cxx::__scoped_lock习惯用法。这样你就不会依赖任何libsupc++不依赖的东西,比如标准库原子或std::mutex,或者std::lock_guard- 即,创建对libstdc++.