Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Cabezon_Encebollao en 14 Julio 2018, 09:41 am



Título: Fallo en Code::Blocks? Sistema operativo?
Publicado por: Cabezon_Encebollao en 14 Julio 2018, 09:41 am
Hola gente, muy buenas! Vereis, tengo un problema que me esta quemando bastante.. y como no soy de mirarme el ombligo, creo que el fallo no es mio EJEM! vereis , supuestamente este codigo esta bien, verdad?

#include<iostream>
using namespace std;

int main()
{
    char *punteru= new char[10];

    // trabajillos con el punteru y al final...

    delete[] punteru;
};

No deberia funcionar sin problemas? tambien probe con el simple delete, por si las moscas, y nada,  me sale con Aborted, core dumped!
Lo unico que me deja hacer para "eliminarlo" es ponerlo a NULL, pero no deberia ser asi!
Uso un sistema operativo muy light (lxle, tipo lubuntu) .. sera incompatible con alguna libreria? Si os paso alguna vez, agradeceria mucho un poco de luz en el asunto!


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: CalgaryCorpus en 14 Julio 2018, 10:40 am
Hay parte del código censurado, y sospecho que el problema está allí.

Que estás haciendo con la memoria pedida?

Otras cosas:
- Este programa mínimo no requiere el include o el using, y
- deberías hacer un return 0 antes de salir del main.


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: Cabezon_Encebollao en 14 Julio 2018, 11:35 am
ups es cierto Calgary! se me paso meter el return 0.. de todos modos no cambia nada.. respecto a la memoria perdida... no tengo ni idea! soy bastante novato y estoy aprendiendo poco a poco a base de palos.. y fallos como este me fastidian bastante la verdad. Como puedo comprobar la memoria perdida? Intento compensarlo poniendo el puntero a NULL, pero como esta creado con new, no se si sirve de algo.


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: CalgaryCorpus en 14 Julio 2018, 14:33 pm
Vas a incluir lo que haces con la memoria pedida?
Es allí donde está el problema, según yo.


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: Cabezon_Encebollao en 14 Julio 2018, 15:52 pm
Supongo, otro remedio no me queda creo... la unica salida que veo es dejar de usar char* y empezar a usar string, no te parece? otra cosa que no me va, es lo de sufijos de la libreria string.
Me parece que en este "ordenador" - es un laptop que le tengo mucho cariño por su comodidad, pero potencia cero- tengo muchas lagunas de restricciones.
Perdona que te vuelva a preguntar, pero, el poner el puntero a NULL, tiene algun efecto sobre estos char* creados con new? Gracias por todo Calgary, vaya paciencia amigo! :D


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: CalgaryCorpus en 14 Julio 2018, 16:04 pm
Insisto pues creo que hay codigo que no has incluido, pero puedo estar equivocado.

Cuando pusiste

 // trabajillos con el punteru y al final...

hay codigo que no incluiste? o en verdad tienes un comentario en el codigo y este programa que solo define memoria, no hace nada, que tiene un comentario, y libera la memoria al final, falla?

Te he preguntado 3 veces de distintas maneras, pero no logro saber si no estas incluyendo codigo en lo que preguntas para simplificar la pregunta.

Podrias explicitamente decir si hay codigo que no estas mostrando? y si es este el caso, podrias incluirlo?


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: Cabezon_Encebollao en 14 Julio 2018, 16:28 pm
Ahh PERDON !! no te estaba entendiendo! el codigo que estaba probando era este (y de nuevo mil perdones, me obceco):

#include<iostream>
using namespace std;

void ConversionStringChar(string s, char *&c)
{
    int cont=0;
    for(int a=0;s[a]!='0';a++)
    {
        c[a]=s[a];
        cont++;
    };
    c[cont]='\0';
};

int contadorStrings(string s)
{
    int cuenta=0;
    for(int a=0;s[a]!='\0';a++)cuenta++;
    return cuenta;
};

int main()
{
    string texto="Pruebas de aprendizaje";
    cout<<texto<<endl;
    cout<<contadorStrings(texto)<<endl;


    char *d = new char[contadorStrings(texto)];
    ConversionStringChar(texto,d);

    cout<<"El contenido del puntero es: "<<d<<endl;

    delete[0] d;

    return 0;
};
// El programa finaliza con el error de Segmentation Fault. (Core dumped)
// Poniendolo a NULL finaliza bien, pero no se si lo toma en serio o no.


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: CalgaryCorpus en 14 Julio 2018, 16:38 pm
Cambia algo el comportamiento si pides un espacio de memoria para el '\0' fiinal?


Código
  1. char *d = new char[contadorStrings(texto)];

modificalo por

Código
  1. char *d = new char[contadorStrings(texto)+1];

Si es este el caso, o no, podrias publicar el codigo, encerrando tu codigo usando el "Codigo Geshi" que aparece entre los botones arriba, para que uno pueda indicar en que linea se ve un problema, y el codigo aparezca con colores de acuerdo a la sintaxis del lenguaje que elijas?


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: Cabezon_Encebollao en 14 Julio 2018, 16:52 pm
Hola Calgary! Eso si que lo probé.. pero ahora el caso, es que no se que cambios debí hacer, porque es cierto que ahora no me va ni sin el delete. Ahora estoy mal de tiempo y no puedo ponerme con ello, así que corto por lo sano y pruebo con esto... es mas sencillo,y  no debería dar ningún error!

Código
  1.  
  2. #include<iostream>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    char *d=new char[10];
  8.    d="Prueba";
  9.    cout<<"El contenido del puntero es: "<<d<<endl;
  10.    delete[] d;
  11.    return 0;
  12. };
  13.  
  14.  


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: CalgaryCorpus en 14 Julio 2018, 17:08 pm
Cambiaste el problema por otro.
Pides memoria en la linea 7 y luego la ignoras y sobreescribes en la linea 8.

Hiciste lo mismo que asignar una variable y luego volverla a asignar con otro valor

i = 3;
i = 5;

El 3 que esta en la primera linea se pierde con la asignacion de 5.
Lo mismo con la memoria que pediste, no tiene sentido liberarla despues en la linea 10 porque la variable d ya no tiene la memoria pedida.

Te sugiero copiar el string, no asignarlo para resolver el problema DE ESTE PROGRAMA y se sugiero pedir memoria suficiente EN EL PROGRAMA ANTERIOR.

Reemplaza la asignacion por

strcpy( d, "Prueba" );

// #include <string.h>  es necesario


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: Cabezon_Encebollao en 14 Julio 2018, 17:10 pm
He encontrado un par de fallos (mios, mecagonlamarsalada)

1. La primera funcion no logre hacerla funcionar de nuevo, asi que la quite y lo hice desde el propio main... con el codigo que te mando ahora funciona perfectamente... tanto con el delete[] como con el delete!!!

2. El otro problema es cuando inicializo el puntero tal que asi: p="Puntero cabron". El cout lo muestra... pero el delete lo revienta. Con el codigo que te mando ahora, me funciona (igual actualizar el lxle sirvio, yo ya no se na jaja)
Código
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int contadorStrings(string s)
  5. {
  6.    int cuenta=0;
  7.    for(int a=0;s[a]!='\0';a++)cuenta++;
  8.    return cuenta;
  9. };
  10.  
  11. int main()
  12. {
  13.    string texto="Pruebas de funcionamiento";
  14.    cout<<texto<<" : "<<contadorStrings(texto)<<endl;
  15.  
  16.    char *d=NULL;
  17.    d=new char[contadorStrings(texto)];
  18.  
  19.    // Si en lugar de la secuencia for inferior pongo p="texto"; el delete rompe
  20.    for(int a=0;texto[a]!='\0';a++)
  21.    {
  22.        d[a]=texto[a];
  23.        cout<<texto[a]<<" ";
  24.    };
  25.    d[contadorStrings(texto)]='\0';
  26.  
  27.    cout<<"\nEl contenido del puntero es: "<<d<<endl;
  28.  
  29.    delete[] d;
  30.    return 0;
  31.  
  32. };
  33.  
  34.  


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: Cabezon_Encebollao en 14 Julio 2018, 17:15 pm
Genial!! ahora ya lo entiendo, Calgary! no contaba con que cambiaba el tipo de asignacion de memoria! Ahora ya entiendo porque pasaba. Mil millones de gracias.. con esto de las memorias estaba echo un lio, ahora ya lo entiendo! tomate unas cuantas cervezas a mi salud, que las has ganado aguantandome :D ( y yo echando la culpa al pc.. sere prepotente :P)


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: CalgaryCorpus en 14 Julio 2018, 17:25 pm
Te falta pedir memoria para el 0 final.
No es suficiente contar los caracteres que quieres copiar desde el string original, porque en verdad requieres 1 mas. Hazme caso y cuando pidas memoria pide 1 mas que los caracteres visibles. La linea 25 de tu programa esta escribiendo en un espacio de memoria que no es tuyo. Hazlo tuyo pidiendo memoria para 1 mas en la linea 17.




Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: Cabezon_Encebollao en 14 Julio 2018, 17:34 pm
Lo haré tienes toda la razon, la que se puede liar por un triste espacio de memoria!
Y no te imaginas lo mucho que me has ayudado con el tema de la asignacion de memoria. No me entraba en la cabeza de que estaba reasignandolo y liandola parda. Ya me siento valiente hasta la proxima liada!
Mil gracias de nuevo, a veces es desesperante tener fallos y no tener ni idea de que pasa y de donde vienen


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: MAFUS en 15 Julio 2018, 02:37 am
Te paso un documento que te irá muy bien para aprender a manejar la memoria. Es para C, pero cómo C++ está basado y es muy parecido en ese aspecto te funcionará igual para saber cómo maneja éste último la memoria.


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: Cabezon_Encebollao en 15 Julio 2018, 18:54 pm
Muchas gracias, Mafus! Reconozco que me hago un lio bastante gordo con ellas!  tengo muy buenas ideas en la cabeza, y cuando me pongo a ello, ya ves... la lio parda :D


Título: Re: Fallo en Code::Blocks? Sistema operativo?
Publicado por: MAFUS en 15 Julio 2018, 21:52 pm
Ups, que no pegué la dirección. Aquí va: http://www2.elo.utfsm.cl/~lsb/elo320/clases/c3.pdf