[C con Clase] Problema extraño con memoria

Samuel Díaz García samueldg en arcoscom.com
Jue Jun 2 12:51:18 CEST 2011


El 95% funciona en modo depuración porque cuando se ejecuta en 
depuración el código "se protege" para el depurador, como puede ser 
inicializar los buffers a 0, etc...

Cuando compilas en para producción (release) metes optimizaciones para 
velocidad, espacio, etc... y resulta que las variables no se 
inicializan, sino que parten con "basura". Por lo cuál, si la basura es 
"buena", pues se puede comer, si no, pues hay que "vomitarla".

Por cierto, la mayoría de los "punteros descontrolados" vienen a causa 
de los "strlen" y de no inicializar o tener en cuenta cosas básicas.

Salu2

vicente lozano escribió:
> Bingo!
> 
> Muchas gracias tio, pensaba que strlen incluia ese caracter en la cuenta.
> 
> Una cosa que no entiendo es porque en el 95% de los casos si que 
> funcionaba, misterios de la vida supongo jejej.
> 
> Un saludo
> 
> 2011/6/1 Salvador Pozo <salvador en conclase.net 
> <mailto:salvador en conclase.net>>
> 
>     El pasado 2011-05-31 11:28:03, Vicente escribió:
> 
>     V> Hola buenas,
>     V> Estoy depurando un programa y me da un problema muy raro con la
>     memoria.
>     V> Hay una modulo listas.c que gestiona listas de elementos:
> 
>     Hola:
> 
>     A mi me funciona, añadiendo este código para probar:
> 
>     ----8<------
>     int main() {
>        ELEMENTO e;
>        LISTA lista;
> 
>        e = malloc(2);
>        strcpy((char*)e, "0");
> 
>        crear_unitaria_copiando(&lista, e, 2);
> 
>        cout << "Hello world!" << endl;
>        return 0;
>     }
>     ----8<------
> 
>     Por lo tanto, sospecho que el error no está en el fragmento de
>     código que adjuntas, sino en el que falta.
> 
>     Casi con total seguridad, el fallo está el definir el tamaño.
>     Recuerda que tienes que añadir un espacio adicional para el carácter
>     nulo terminador. Por eso, para una cadena de un carácter, como "0",
>     se debe indicar un tamaño de 2.
> 
>     Si en este mismo código usas 1, o el valor de strlen(), se produce
>     el fallo que comentas, porque en tu función no se copia el nulo
>     terminador, y al mostrar la cadena, se siguen imprimiendo caracteres
>     hasta que por casualidad aparece un nulo.
> 
>     --
>     Salvador Pozo (Administrador)
>     mailto:salvador en conclase.net <mailto:salvador en conclase.net>
>     _______________________________________________
>     Lista de correo Cconclase Cconclase en listas.conclase.net
>     <mailto:Cconclase en listas.conclase.net>
>     http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>     Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>     <http://listas.conclase.net/index.php?gid=2&mnu=FAQ>
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ

-- 
    Samuel Díaz García
     Director Gerente
ArcosCom Wireless, S.L.U.

CIF: B11828068
c/ Romero Gago, 19
Arcos de la Frontera
11630 - Cadiz

http://www.arcoscom.com

mailto:samueldg en arcoscom.com
msn: samueldg en arcoscom.com

Móvil: 651 93 72 48
Tlfn.: 956 70 13 15
Fax:   956 70 34 83




Más información sobre la lista de distribución Cconclase