Это звучит как фрагментация. Фрагментация вызвана размещением объектов в стеке, например:
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 (или аналог в вашей ОС, чтобы вы могли контролировать, когда он появляется откуда-то при запуске приложения).
Затем переопределите операторы new и delete для подозрительного класса, чтобы они возвращали слоты из этого вектора. Итак, ваши объекты будут храниться в этом векторе.
Вы можете переопределить new и delete для классов того же размера, которые будут помещены в этот вектор.
Создание пулов разных размеров для разных объектов.
Сначала пойди на худших обидчиков.
Я делал что-то подобное раньше, и это решило мою проблему на встроенном устройстве. Я также использовал много STL, поэтому я создал собственный распределитель (google для stl custom allocator - есть множество ссылок). Это было полезно для записей, хранящихся в мини-базе данных, используемой моей программой.