#872 closed defect (fixed)
Lost instances when the use of the :: operator is concatenated
Reported by: | Owned by: | Víctor de Buen Remiro | |
---|---|---|---|
Priority: | highest | Milestone: | Mantainance |
Component: | OOP | Version: | 2.0.1 |
Severity: | critical | Keywords: | |
Cc: | mafernandez@… |
Description
Al comenzar a utilizar MMS con modelos masivos nos encontramos con problemas de memoria RAM, en lo que parece un excesivo despilfarro de la misma.
Parece ser que una de las causas es la existencia de instancias perdidas por el uso concatenado del operador "::".
Es decir cuando concatenamos a la llamada de un método que devuelve un objeto otra llamada a un método del objeto devuelto:
Anything anything = Object::GetObject2(?)::Method(?)
Adjunto un ejemplo hecho a propósito para mostrar este problema.
Attachments (1)
Change History (5)
Changed 15 years ago by
Attachment: | ticket_19.LostInstances.tol added |
---|
comment:1 Changed 15 years ago by
Milestone: | → Manteinance |
---|---|
Status: | new → accepted |
comment:2 Changed 15 years ago by
Aunque el objetivo a controlar es la memoria eso es algo dificil de medir pues depende de muchas cosas como el sistema de paginación del sistema operativo. Para detectar problemas del tipo memory leak como éste es mejor usar la variable global Real NObject
haciéndole fotos antes y después de correr el código a chequear. En este caso sería algo así:
Real maxIter = 1000; Real nObject01 = Copy(NObject); Real check = { Set For(1, maxIter, Real (Real i) { Real SampleCreator::CreateSample(?)::GetAverage(?); 0 }); 1 }; Real nObject02 = Copy(NObject); //Los únicos objetos que deben sobrevivir son Real check y el propio //Real nObject01 usado para medir el número de objetos // así que hay que restar 2 objetos para obtener los no borrados WriteLn("Número de objetos no borrados por iteración: "<< (Real (nObject02-nObject01 -2)/maxIter));
Al ejecutarlo se obtiene lo siguiente
Número de objetos no borrados por iteración: 3
En cambio si se usa en el ciclo la sintaxis
NameBlock sample = SampleCreator::CreateSample(?); Real sample::GetAverage(?);
entonces no se deja nada sin borrar.
comment:3 Changed 15 years ago by
Resolution: | → fixed |
---|---|
Status: | accepted → closed |
comment:4 Changed 15 years ago by
Version: | → 2.0.1 |
---|
Gracias Pedro, ha sido un buen trabajo de detección y aislamiento del problema, por lo que ha sido casi trivial arreglarlo.
Parece evidente que se deja objetos sin borrar (memory leak) cuando se usa esa sintaxis, lo cual se hace aún más notorio si se intenta recompilar ese código, pues nos encontramos con estos errores: