Probablemente haya construido muy optimizado.
En la mayoría de los sistemas modernos, gcc sabe que malloc devuelve un puntero sin alias. Es decir, nunca devolverá el mismo puntero dos veces y nunca devolverá un puntero que haya guardado 'en vivo' en otro lugar.
Me parece muy difícil de imaginar, pero es posible que malloc se llame una vez y su valor de retorno se utilice una y otra vez. Las razones son:
Sabe que su memoria es una tienda muerta. es decir: usted escribe, pero nunca se lee. Se sabe que el puntero no tiene alias, por lo que no se ha escapado para leerse en otro lugar y no está marcado como volátil. Su bucle for/sí/puede ser desechado.
En ese momento podría usar la misma memoria una y otra vez.
Ahora, esta es la razón por la que me resulta difícil de creer: ¿cuánto sabe gcc sobre malloc? Malloc podría tener cualquier tipo de efectos secundarios como incrementar una 'cantidad de veces' global 'para' pintar mi habitación con un tono aleatorio de azul '. Parece realmente extraño que abandone la llamada y suponga que es libre de efectos secundarios. Demonios, 'malloc' podría implementarse para devolver NULL cada centésima llamada (tal vez no exactamente según las especificaciones, pero quién puede decir).
Lo que NO está haciendo es liberarlo en su nombre. Eso va más allá de lo que "podría" saber y en el territorio de "hacer cosas que simplemente no se permite". Se te permite perder memoria, aunque pueda ser flojo.
2 cosas serían útiles aquí: 1) Compile environmenet: que os, compilador y banderas de línea de comando.
y 2) desmontaje del binario final. (objdump o del compilador)
porque la memoria está asignada de una vez al principio? –
@arasmussen Dentro de un ciclo 'while'. –
Quizás el compilador vea que ya no tiene un control sobre ese puntero (porque usted escribe más de una vez ptr) y está limpiando después de eso para usted? ¿O tal vez lleva mucho tiempo ejecutar diez millones de iteraciones? –