Это звучит как фрагментация. Фрагментация вызывается вы выделения объектов в стеке, скажем:
object1
object2
object3
object4
и удалить некоторые объекты
object1
object3
object4
Теперь у вас есть отверстие в неиспользуемой памяти. Если вы выделите другой объект, который слишком большой для отверстия, отверстие останется впустую. В конце концов, с достаточным количеством отбросов памяти, у вас может получиться так много дыр, что они теряют память.
Путь к этому заключается в том, чтобы попытаться решить ваши требования к памяти спереди. Если у вас есть определенные объекты, которые, как вы знаете, вы создаете многие, попробуйте и убедитесь, что они одного размера.
Вы можете использовать пул, чтобы сделать распределение более эффективным для определенного класса ... или по крайней мере позволить вам отслеживать его лучше, чтобы вы могли понять, что происходит, и придумать хорошее решение.
Один из способов сделать это, чтобы создать один статический:
struct Slot
{
Slot() : free(true) {}
bool free;
BYTE data[20]; // you'll need to tune the value 20 to what your program needs
};
Slot pool[500]; // you'll need to pick a good pool size too.
Создать пул фронт, когда ваш запуск программы и предварительно выделить его так, что он такой большой, как максимальные требования к программе , Вы можете захотеть HeapAlloc (или эквивалент в вашей ОС, чтобы вы могли контролировать, когда он появляется откуда-то в вашем приложении).
Затем переопределите новые и удалите операторы для подозрительного класса, чтобы они возвращали слоты из этого вектора. Таким образом, ваши объекты будут сохранены в этом векторе.
Вы можете переопределить новые и удалить для классов того же размера, которые будут помещены в этот вектор.
Создать пулы разных размеров для разных объектов.
Просто пойдите для худших нарушителей сначала.
Я уже делал что-то подобное раньше, и это решило мою проблему на встроенном устройстве. Я также использовал много STL, поэтому создал пользовательский распределитель (google для stl custom allocator - есть множество ссылок). Это было полезно для записей, хранящихся в мини-базе данных, используемой моей программой.
Есть ли у вас код, который отличается? Действительно ли это идентично? Если нет, то в чем разница. Просто быстрые мысли. –
Я предполагаю, что вы имеете в виду: начинается с 50 kb * бесплатно *? – MSalters
Да, он начинается с 50 КБ бесплатно. Да, есть и определенный код платформы. Но я отключил его во время его запуска в системе ontarget. Но, все тот же вопрос. – Ajay