我们在嵌入式系统环境中使用 C++,基本上不想要任何类型的动态内存分配(例如,请参阅嵌入式应用程序中的内存管理资源,了解我们不这样做的原因)。我们仍然不想缺少一些不错的基于 C++ 的特性,例如 STL 容器和 std::string。对于第一个,我们会在初始化时保留一个特定的大小,并且不会让容器超出其容量。对于后者(std::string),我对如何“安全”地使用它们有点怀疑,因为它们有时会在堆上分配内存。
不过,我发现使用 std::string (以及通常其他堆分配对象)似乎很好的情况:我会在堆栈上分配对象本身(在{}
我正在谈论的某个范围内来自 C++)并允许它们分配堆,前提是它们在超出范围时实际上释放了所有保留的内存。
我知道这种方法并不能绝对保证内存碎片的自由,但我觉得如果手头的范围是短暂的,这实际上会在范围结束后导致连续的可用内存。
我还怀疑,当多个任务共享同一个堆但如果手头的范围都是短暂的(例如,不要阻塞),空闲内存最终应该是连续的,这可能会出现问题。或者,我可以接受的是,只允许一个任务在堆上分配内存,如果这真的很重要,其他任务则不能。
我建议的堆分配对象用法是否有效?是否有人有另一种策略来(部分)启用动态内存分配而不会冒内存碎片的风险?