Esto suena como fragmentación. La fragmentación se produce por que la asignación de los objetos en la pila, por ejemplo:
objeto1
objeto2
object3
object4
Y a continuación, eliminar algunos objetos
objeto1
object3
object4
Ahora tiene un agujero en la memoria que no se usa. Si asigna otro objeto que es demasiado grande para el hoyo, el hoyo seguirá siendo un desperdicio. Eventualmente, con suficiente memoria de abandono, puede terminar con tantos agujeros que pierden la memoria.
La solución a esto es intentar y decidir los requisitos de memoria por adelantado. Si tiene objetos particulares que sabe que está creando muchos, intente y asegúrese de que sean del mismo tamaño.
Puede usar una agrupación para hacer que las asignaciones sean más eficientes para una clase en particular ... o al menos permitirle hacer un seguimiento de la misma para que pueda comprender lo que está sucediendo y encontrar una buena solución.
Una forma de hacer esto es crear una sola estática:
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.
crear la agrupación en la delantera cuando el programa se inicia y antes de asignarlo de manera que es tan grande como los requisitos máximos para su programa . Es posible que desee HeapAlloc (o el equivalente en su sistema operativo para que pueda controlar cuándo aparece desde algún lugar en el inicio de la aplicación).
A continuación, anule los operadores nuevos y elimine para una clase sospechosa para que devuelvan las ranuras de este vector. Entonces, tus objetos serán almacenados en este vector.
Puede anular nuevo y eliminar para las clases del mismo tamaño para poner en este vector.
Cree grupos de diferentes tamaños para diferentes objetos.
Simplemente busque los peores delincuentes al principio.
He hecho algo así antes y resolvió mi problema en un dispositivo incrustado. También estaba usando un montón de STL, así que creé un asignador personalizado (google para stl asignador personalizado - hay muchos enlaces). Esto fue útil para los registros almacenados en una mini-base de datos que mi programa usó.
¿Tiene algún código diferente? ¿Es realmente idéntico? Sí no, Cuál es la diferencia. Solo algunos pensamientos rápidos. –
Supongo que quiere decir: comienza con 50 kb * gratis *? – MSalters
Sí, comienza con 50 KB gratis. Sí, también hay algún código específico de plataforma. Pero lo desactivé mientras lo ejecutaba en el sistema ontarget. Pero, aún el mismo problema. – Ajay