delphi memory-leaks fastmm

Delphi: memoryleak en IdStack, pero ¿quién usa IdStack?



memory-leaks fastmm (4)

El administrador de memoria Delphi FastMM proporciona un método

function RegisterExpectedMemoryLeak(P: Pointer): boolean;

Entonces, si ha encontrado la unidad y resulta que no puede eliminarla, puede utilizar este método para suprimir una advertencia de fuga de memoria.

FAstMM informa una pérdida de memoria de una TIdCriticalSection en IdStack.pas. Entiendo que esta es una fuga intencional, que está documentada en el código.

Lo que no entiendo es por qué IdStack está incluido en mi proyecto. ¿Cómo puedo saber qué unidad lo atrae?

¿Hay alguna manera de excluir esta filtración del informe, usando la versión de fastmm que viene con delphi 2007?

ACTUALIZAR: ¿Hay alguna forma de encontrar todos los pas-archivos incluidos en una compilación?


Hay mucho sobre esto en la red, aunque está disperso. Esto depende de si está usando Indy 9 (con D7) o posterior. Me ha engañado a mí también. Para Indy 9 hice lo siguiente en IdComponent.pas:

initialization GStackCriticalSection := TCriticalSection.Create; // BJF Starts //RegisterExpectedMemoryLeak(GStackCriticalSection); // BJF Ends finalization // Dont Free. If shutdown is from another Init section, it can cause GPF when stack // tries to access it. App will kill it off anyways, so just let it leak // BJF has removed comments FreeAndNil(GStackCriticalSection); end.

Pero tenga en cuenta que debe poner un camino a la fuente de Indy en la ruta de la biblioteca. Creo que Indy 10 está arreglado a este respecto. Brian


Mire Uses en su .dpr Use cnPack (cnPack.org) y seleccione ''Uses Cleaner'' para eliminar las unidades que no se mencionan.


Todas las unidades de Indy tienen un prefijo ''Id'', así que verifica si tienes alguna de esas en tus cláusulas de uso.

Otra forma podría ser colocar un punto de interrupción en TIdStack.create (). Eventualmente, el culpable aparecerá en la pila de llamadas.