我们在嵌入式系统环境中使用C++,基本上不希望任何种类的动态内存分配(例如,请参阅Resources for memory management in embedded application)我们不这样做的原因)。尽管如此,我们仍然不希望没有一些基于C++的好功能,如STL容器和std :: string。对于第一个,我们会在初始化时保留一个特定的大小,并且不会让容器超出其容量。对于后者(std :: string),我有点怀疑如何“安全”地使用它们,因为它们有时会在堆上分配内存。但我发现使用std :: string(以及其他堆分配对象)的情况很好:我会在堆栈上分配对象本身(在由{}
定界的特定范围内因为我正在从C++谈话),并允许它们分配堆,只要它们在超出范围时实际上释放了所有保留的内存。允许堆在短暂范围内分配对象以确保内存碎片自由
我明白这种方法并不能保证内存碎片的自由,但我觉得如果手头的范围很短,实际上会在范围结束后产生一个连续的空闲内存。
我也有过怀疑,有可能是一个问题,当多个任务共享同一个堆,但仍然可用内存应在年底连续提供手头的范围都是短暂的(不会阻止为例)。另外,我认为只有一个任务被允许在堆上分配内存,而其他的则不能,如果这真的很重要的话。
我建议使用堆分配对象有效吗?有人有另一种策略(部分)启用动态内存分配而不会冒内存碎片风险吗?
不知道你使用的系统很难回答。我在嵌入式Linux上开展了一项工作,即使内存很小(64MB)并且设备始终保持运行状态,也不会出现内存碎片问题。 – syam 2013-05-06 15:35:24
@syam:64MB ==小?我认为64 * K * B在我的一些项目中很大:) – 2013-05-10 12:15:33