{"id":508,"date":"2023-09-10T17:08:36","date_gmt":"2023-09-10T16:08:36","guid":{"rendered":"https:\/\/jorgeturiel.es\/?p=508"},"modified":"2023-09-11T11:53:47","modified_gmt":"2023-09-11T10:53:47","slug":"controlando-fugas-de-memoria-en-lazarus","status":"publish","type":"post","link":"https:\/\/jorgeturiel.es\/?p=508","title":{"rendered":"Controlando fugas de memoria en Lazarus"},"content":{"rendered":"\n<p>En el 2013, escrib\u00ed una entrada para un <a href=\"https:\/\/blueicaro.wordpress.com\/2013\/03\/27\/controlando-fugas-de-memoria-en-lazarus-1-0-memory-leaks\/\">blog<\/a> que manten\u00eda de por aquel tiempo. Esta entrada comentaba el m\u00e9todo o sistema que implementa <a href=\"https:\/\/www.lazarus-ide.org\/\">Lazarus<\/a> para controlar las fugas memoria.<\/p>\n\n\n\n<p>El m\u00e9todo no ha cambiado, aunque si la manera de activarlo y alguna detalle m\u00e1s que se a\u00f1adi\u00f3, me he animado a actualizar aquella entrada.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Las fugas de memoria o en ingl\u00e9s <em>Memory Leaks<\/em>, se producen cuando un programa se carga en la memoria, y crea  objetos, a los cuales se le asigna un espacio de memoria, y cuando el programa termina de ejecutarse no devuelve todo el espacio de memoria asignado al sistema operativo. Por tanto, si ejecutamos una y otra vez ese programa, llegar\u00eda un momento que el sistema operativo no tendr\u00eda m\u00e1s memoria para ejecutar programas.<\/p>\n\n\n\n<p>La soluci\u00f3n a este problema en Lazarus, \u00absobre el papel\u00bb, es muy sencillo. Cada objeto que cree el programador, debe encargarse el mismo programador en borrarlo de la memoria. Un ejemplo, tenemos un <em>TStringList<\/em> llamado Lista, deber\u00edamos programar algo as\u00ed:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \" >    Var\n\n    Lista : TstringList;\n\n    Begin\n\n    Lista := TstringList.Create;\n\n    \u2026\n\n    \u2026.\n\n    FreeAndNil (Lista)\n\n    end;<\/pre><\/div>\n\n\n\n<p>El problema viene que muchos veces los programas son muy grandes, las prisas, un d\u00eda malo, etc., puede hacer que te olvides de liberar el objeto.<\/p>\n\n\n\n<p>Para eso Lazarus, pone a nuestra disposici\u00f3n un herramienta que analiza nuestro programa tras ejecutarse y nos dice d\u00f3nde se han producido \u00abLeaks memory\u00bb.  Para activarla vamos a opciones de proyecto en el men\u00fa proyecto (Shift+ctrl+F11) y seleccionamos <em>Configuraci\u00f3n y objetivo<\/em>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"568\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_174023-1024x568.png\" alt=\"\" class=\"wp-image-510\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_174023-1024x568.png 1024w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_174023-300x166.png 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_174023-768x426.png 768w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_174023.png 1146w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Opciones de proyecto<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Ahora pulsamos, sobre los tres puntos, en la parte superior, para crear los modos de construcci\u00f3n.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"612\" height=\"383\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_174055.png\" alt=\"\" class=\"wp-image-511\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_174055.png 612w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_174055-300x188.png 300w\" sizes=\"auto, (max-width: 612px) 100vw, 612px\" \/><figcaption class=\"wp-element-caption\">Modos de construcci\u00f3n.<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Y para terminar pulsamos sobre <em>Crear los modos de depuraci\u00f3n y liberaci\u00f3n.<\/em><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"612\" height=\"383\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_174619.png\" alt=\"\" class=\"wp-image-512\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_174619.png 612w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_174619-300x188.png 300w\" sizes=\"auto, (max-width: 612px) 100vw, 612px\" \/><figcaption class=\"wp-element-caption\">Modos de depuraci\u00f3n y liberaci\u00f3n<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Ahora solo hay que aceptar en todas la ventanas abiertas. <\/p>\n\n\n\n<p>En la ventana principal de Lazarus, arriba a la izquierda existe un icono con forma de engranaje, si lo despliegas ver\u00e1s que hay 3 modos. Seg\u00fan el que tengas seleccionado, el programa se compilara con unas opciones u otras. El modo que nos interesa cuando estamos probando el programa en modo depuraci\u00f3n. As\u00ed que selecci\u00f3nalo y hagamos una prueba.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"292\" height=\"252\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_174154.png\" alt=\"\" class=\"wp-image-513\"\/><figcaption class=\"wp-element-caption\">Modos de compilaci\u00f3n<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Vuelve a ejecutar el programa anterior y al cerrarlo aparecer\u00e1 un informe, mostrando que no hay ning\u00fan bloque de memoria sin liberar.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/lazarus2.png\" alt=\"\" class=\"wp-image-514\" style=\"width:336px;height:229px\" width=\"336\" height=\"229\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/lazarus2.png 336w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/lazarus2-300x204.png 300w\" sizes=\"auto, (max-width: 336px) 100vw, 336px\" \/><\/figure>\n<\/div>\n\n\n<p>En caso contrario mostrar\u00eda un informe m\u00e1s detallado. Por ejemplo, el siguiente c\u00f3digo:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \" >procedure TForm1.Button1Click(Sender: TObject);\nvar\ni: Integer;\nlista: TStringList;\nbegin\ncadena := \u2018hola\u2019;\nlista := TStringList.Create;\nfor i := 0 to 20 do\nbegin\nlista.add (\u2018a\u2019);\nend;\nFreeAndNil(Lista);\nend;<\/pre><\/div>\n\n\n\n<p>Al cerrarse el programa obtendr\u00edamos el siguiente resultado.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"490\" height=\"454\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/lazarus3.png\" alt=\"\" class=\"wp-image-515\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/lazarus3.png 490w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/lazarus3-300x278.png 300w\" sizes=\"auto, (max-width: 490px) 100vw, 490px\" \/><figcaption class=\"wp-element-caption\">Fuga de memoria<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Con detalle, se observa que al final, indica que el problema se produce en la l\u00ednea 55 del evento <em>Click<\/em> de un <em>TButton<\/em>. Adem\u00e1s d\u00f3nde antes dec\u00eda cero bloques si liberar ahora pone 2.<\/p>\n\n\n\n<p>Por supuesto la soluci\u00f3n pasa por liberar el objeto <em>Lista.<\/em><\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \" >procedure TForm1.Button1Click(Sender: TObject);\nvar\ni: Integer;\nlista: TStringList;\nbegin\ncadena := \u2018hola\u2019;\nlista := TStringList.Create;\nfor i := 0 to 20 do\nbegin\nlista.add (\u2018a\u2019);\nend;\nFreeAndNil(Lista);\nend;<\/pre><\/div>\n\n\n\n<p>Al compilar el programa en este modo, el archivo ejecutable es muy grande ya que contiene la informaci\u00f3n para poder depurarlo. Cuando hayamos terminado de depurar nuestro programa, podemos compilarlo en modo <em>release (<\/em>o liberaci\u00f3n). Para ello solo hay que cambiar el modo en el icono del engrane, tal como se mostr\u00f3 anteriormente.<\/p>\n\n\n\n<p>Un detalle a tener en cuenta, que cuando compilas el programa en Windows, al terminar se muestra una ventana emergente. Si se compila en Linux, esta ventana no se muestra. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"618\" height=\"185\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_180023.png\" alt=\"\" class=\"wp-image-518\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_180023.png 618w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_180023-300x90.png 300w\" sizes=\"auto, (max-width: 618px) 100vw, 618px\" \/><\/figure>\n<\/div>\n\n\n<p>Para ver la informaci\u00f3n debemos abrir la consola de Entrada y Salida, para ello, usando el men\u00fa Ver, dentro de ventanas de depuraci\u00f3n seleccionar Console In\/Output. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"702\" height=\"821\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_180520.png\" alt=\"\" class=\"wp-image-517\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_180520.png 702w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/09\/Screenshot_20230910_180520-257x300.png 257w\" sizes=\"auto, (max-width: 702px) 100vw, 702px\" \/><\/figure>\n<\/div>\n\n\n<p>Saludos<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En el 2013, escrib\u00ed una entrada para un blog que manten\u00eda de por aquel tiempo. Esta entrada comentaba el m\u00e9todo o sistema que implementa Lazarus para controlar las fugas memoria. El m\u00e9todo no ha cambiado, aunque si la manera de activarlo y alguna detalle m\u00e1s que se a\u00f1adi\u00f3, me he animado a actualizar aquella entrada.<\/p>\n","protected":false},"author":2,"featured_media":509,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27,25],"tags":[23,24],"class_list":["post-508","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-lazarus","category-pascal","tag-lazarus","tag-programacion"],"_links":{"self":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/508","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=508"}],"version-history":[{"count":2,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/508\/revisions"}],"predecessor-version":[{"id":519,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/508\/revisions\/519"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/media\/509"}],"wp:attachment":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=508"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=508"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=508"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}