Fallo en Code::Blocks? Sistema operativo?

Iniciado por Cabezon_Encebollao, 14 Julio 2018, 09:41 AM

0 Miembros y 3 Visitantes están viendo este tema.

Cabezon_Encebollao

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!

CalgaryCorpus

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.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Cabezon_Encebollao

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.

CalgaryCorpus

Vas a incluir lo que haces con la memoria pedida?
Es allí donde está el problema, según yo.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Cabezon_Encebollao

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

CalgaryCorpus

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?
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Cabezon_Encebollao

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.

CalgaryCorpus

Cambia algo el comportamiento si pides un espacio de memoria para el '\0' fiinal?


Código (cpp) [Seleccionar]
char *d = new char[contadorStrings(texto)];

modificalo por

Código (cpp) [Seleccionar]
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?
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Cabezon_Encebollao

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 (cpp) [Seleccionar]


#include<iostream>
using namespace std;

int main()
{
    char *d=new char[10];
    d="Prueba";
    cout<<"El contenido del puntero es: "<<d<<endl;
    delete[] d;
    return 0;
};


CalgaryCorpus

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
Aqui mi perfil en LinkedIn, invitame un cafe aqui