2009-08-13 9 views
7

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.Delphi: memoryleak en IdStack, pero ¿quién usa IdStack?

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

¿Hay alguna forma de excluir esta fuga del informe, utilizando la versión de fastmm que viene con delphi 2007?

ACTUALIZACIÓN: ¿Hay alguna manera de encontrar todos los pas-archivos incluidos en una compilación?

Respuesta

4

Todas las unidades Indy tienen un prefijo 'Id', así que verifique si tiene alguna de esas en sus 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.

+0

He intentado los puntos de interrupción, pero nunca se rompe. Parece que la sección de inicialización/finalización es el único código que se ejecuta. Estoy haciendo un grep masivo ahora, para ver si puedo encontrar algo. – Vegar

+0

¡Un grep ancho encontró la unidad usada! – Vegar

2

mirada a usos en su .dpr Uso cnPack (cnPack.org) y seleccione 'Usos Cleaner' para eliminar unidades no referenciados

+0

Otra opción para hacer esto es Icarus, un subconjunto gratuito de Pascal Analyzer: http://www.peganza.com/#ICARUS –

+0

wow. He oído hablar de cnPack, pero nunca lo probé. Eso tiene que ser cambiado! :-) Gracias. – Vegar

8

El gestor de memoria de Delphi FastMM proporciona un método

function RegisterExpectedMemoryLeak(P: Pointer): boolean; 

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

4

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 usted 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

+0

No elimine estos comentarios. En una aplicación multiproceso, puede fallar debido a eso. Es una variable global, y Windows liberará la memoria y los controladores del kernel (como secciones críticas) al finalizar de todos modos. Consulte este enlace y los artículos a los que se vincula: http://blogs.msdn.com/b/oldnewthing/archive/2010/01/22/9951750.aspx –

Cuestiones relacionadas