🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: es.comp.os.linux.programacion
13 messages
13 total messages Started by Luis Molina Thu, 22 Jul 1999 00:00
PROBLEMA DE MEMORIA
#18677
Author: Luis Molina
Date: Thu, 22 Jul 1999 00:00
62 lines
2677 bytes
Hola!

Tengo un problema muy extra�o ahora que me actualic� de la Debian 2.0 a
la Debian 2.1 (aunque no esoty seguro de
que se deba a ese cambio).

Estoy este verano haciendo un programa en C++ (para una asignatura) bajo
Linux, y sucede que
en cierto m�todo de una clase al intentar reservar memoria devuelve el
no deseable mensaje de que ha recibido
una se�al SIGSEGV (la forma elegante del Segmentation Fault).

Realmente me produce el error en el mismo momento de reservar la memoria
(comprobado con el gdb y variantes):

- Casos que he probado (creo que demasiados :-( ):

char *cadena;

------------
- malloc(20) � cadena = malloc(20) -> Funciona

- malloc(40) � cadena = malloc(40) -> Da el error

- cadena = new char[5] -> Funciona

- cadena = new char[50] -> Da el error

- cadena = strdup(aux) donde aux es una cadena ya reservada de 50
caracteres -> Da el error

El problema no es debido a la asignaci�n porque lo he probado hasta el
caso de reservar memoria y no asignarlo.

En otras partes del programa puedo reservar y liberar cantidades mayores
de memoria sin ning�n problema, he incluso
dicho error se da al ejecutar dicho m�todo por tercera vez, no las veces
anteriores :-?.

Estoy utilizando para compilar el egs y g++ (del egs V. 2.91.6) con las
librer�as
stdc++ (V. 2.9)

�Sabeis si la librer�a libc6 V 2.0.7 o la stdc++ 2.91.6 presentan alg�n
error
de memoria por el que no sea recomendable?

Me he tirado todo el d�a d�ndole vueltas al asunto y ya no veo nada. 

Nota : El programa no es concurrente ni se comunica con otros procesos
(y no utiliza m�s librer�as que la est�ndar de C++ junto con el uso de
clases STL). 

Si quereis os env�o la clase del c�digo que falla para que lo probeis y
veais (no es mucho, s�lo un fichero .cc y otro .h).

            L U I S  M O L I N A     :)    "We're happy as fish, and
            --------------------------------------------------------
            gorgeous as geese, and wonderfully clean in the morning"
  
            <http://personal.redestb.es/lmolina> Bledo en la Red
            <http://personal.redestb.es/lmolina/genesis.htm> Genesis
Re: PROBLEMA DE MEMORIA
#18682
Author: Ignacio Arenaza
Date: Thu, 22 Jul 1999 00:00
28 lines
1763 bytes
>>>>> "Luis" == Luis Molina <lmolina@redestb.es> writes:

    Luis> Hola!  Tengo un problema muy extra�o ahora que me actualic�
    Luis> de la Debian 2.0 a la Debian 2.1 (aunque no esoty seguro de
    Luis> que se deba a ese cambio).

    Luis> Estoy este verano haciendo un programa en C++ (para una
    Luis> asignatura) bajo Linux, y sucede que en cierto m�todo de una
    Luis> clase al intentar reservar memoria devuelve el no deseable
    Luis> mensaje de que ha recibido una se�al SIGSEGV (la forma
    Luis> elegante del Segmentation Fault).

Por lo que cuentas, y diciendo que lo hace a la tercera, me da en la
nariz que estas pisando memoria que no es tuya. Me explico, malloc no
solo reserva la memoria que tu le pides, sino un poco mas para la
informacion de control suya. Este trozo adicional suele ser contiguo a
la memoria reservada para ti. Si tu te sales de tu zona y tocas en la
suya, en las siguientes invocaciones sueles tener problemas como el
que describes.

Asi que revisa bien el uso que haces de la memoria reservada en ese
metodo. Como ultimo recurso puedes usar comprobadores como Electric
Fence o Checker que sirven para detectar este tipo de problemas.
Saludos. I�aki.

-- 
  PGP Key available at http://personales.jet.es/inaki.arenaza/pgpkey.html
  Linux Registered User #44369
Re: PROBLEMA DE MEMORIA
#18698
Author: Luis Molina
Date: Fri, 23 Jul 1999 00:00
29 lines
1808 bytes
Hola!

Ignacio Arenaza wrote:

>     Luis> Estoy este verano haciendo un programa en C++ (para una
>     Luis> asignatura) bajo Linux, y sucede que en cierto m�todo de una
>     Luis> clase al intentar reservar memoria devuelve el no deseable
>     Luis> mensaje de que ha recibido una se�al SIGSEGV (la forma
>     Luis> elegante del Segmentation Fault).

 
> Por lo que cuentas, y diciendo que lo hace a la tercera, me da en la
> nariz que estas pisando memoria que no es tuya. Me explico, malloc no
> solo reserva la memoria que tu le pides, sino un poco mas para la
> informacion de control suya. Este trozo adicional suele ser contiguo a
> la memoria reservada para ti. Si tu te sales de tu zona y tocas en la
> suya, en las siguientes invocaciones sueles tener problemas como el
> que describes.

Puede ser, mirar� despacito el uso de la memoria, gracias, si es eso ya
lo dir�.

-- 
            L U I S  M O L I N A     :)    "We're happy as fish, and
            --------------------------------------------------------
            gorgeous as geese, and wonderfully clean in the morning"
  
            <http://personal.redestb.es/lmolina> Bledo en la Red
            <http://personal.redestb.es/lmolina/genesis.htm> Genesis
Re: PROBLEMA DE MEMORIA
#18727
Author: Cymoril sin patas
Date: Mon, 26 Jul 1999 00:00
54 lines
3300 bytes
A 22 Jul 1999 16:52:33 +0200, Ignacio Arenaza <inaki.arenaza@jet.es>
escribiste:

>>>>>> "Luis" == Luis Molina <lmolina@redestb.es> writes:
>
>    Luis> Estoy este verano haciendo un programa en C++ (para una
>    Luis> asignatura) bajo Linux, y sucede que en cierto m�todo de una
>    Luis> clase al intentar reservar memoria devuelve el no deseable
>    Luis> mensaje de que ha recibido una se�al SIGSEGV (la forma
>    Luis> elegante del Segmentation Fault).
>Por lo que cuentas, y diciendo que lo hace a la tercera, me da en la
>nariz que estas pisando memoria que no es tuya.
Pos hombre, si hay un segmentation fault, est� bastante claro que es
porque pisas memoria de otro. De todas formas, estoy hasta el qlo de
SISEGVs cuando kompilo el kernel. Linux no funciona en mi ordenata ni
a tiros. Se cuelga al de un rato de arrancar etc. y siempre SISGEVs de
esos por medio. � ser� la RAM ?
> Me explico, malloc no
>solo reserva la memoria que tu le pides, sino un poco mas para la
>informacion de control suya. Este trozo adicional suele ser contiguo a
>la memoria reservada para ti. Si tu te sales de tu zona y tocas en la
>suya, en las siguientes invocaciones sueles tener problemas como el
>que describes.
Pos hombre, eso es mu bonito. Pero entonces significar�a que malloc
tiene un fallo mun gordo. Se supone que busca una zona de memoria
libre y � se pisa a si mismo ? Lo cierto es que llevo exactamente 8
d�as "programando" C, pero no me pega nada que eso pueda ser as�. De
lo contrario, � cu�ntas variables din�micas puedes declarar ? 2 ? Las
declaras todas al principio ?
Creo que no.
De todas formas, si que he visto algo en el mensaje de Luis Molina que
me ha llamado mucho la atenci�n. Repito que llevo __ocho__ d�as en
esto del "C" y "C++", pero si mal no recuerdo, en el libro de Fco.
Javier Ceballos -que me le� en dos d�as, con lo que puede que me
equivoque- dec�a que malloc y new son incompatibles y que s�lo se
puede utilizar una de ellas en los programas, por la forma que tienen
de reservar la memoria. Por lo que recuerdo -supongo que mal, pero
bueno- malloc reserva la memoria desde la cima del c�digo hacia la
pila y new desde la pila hacia la cima del c�digo. Quiz� es por eso,
que se pisan los news con los controles de los mallocs ... �? no lo
s�. En fin, espero no haberos vuelto locos y al menos, haberos dado
alguna idea �til.

Cymoril sin patas
03:12 a.m.



-----------------------------------------------
Cymoril sin patas

"I believe this is heaven to no one else but me, and I'll defend it as long as I can be left alone to linger in my own silence." 

-----------------------------------------------
Re: PROBLEMA DE MEMORIA
#18737
Author: Enrique Ferrero
Date: Tue, 27 Jul 1999 00:00
4 lines
656 bytes
Como bien dice Cymoril, mezclar malloc y new en C++ es un problema. En todos
sitios se recomienda new. Parece que es m�s potente y seguro.

No uses malloc con C++. new es mejor.
Re: PROBLEMA DE MEMORIA
#18654
Author: Luis Molina
Date: Wed, 28 Jul 1999 00:00
43 lines
2183 bytes
Hola!

Cymoril sin patas wrote:

Bueno, lo solucion�, efectivamente era que ten�a un puntero "perdido" 
que implicaba que el siguiente malloc realizado tras un uso 
"incorrecto" diese ese error.

> >Si tu te sales de tu zona y tocas en la
> >suya, en las siguientes invocaciones sueles tener problemas como el
> >que describes.

> Pos hombre, eso es mu bonito. Pero entonces significar�a que malloc
> tiene un fallo mun gordo. Se supone que busca una zona de memoria
> libre y � se pisa a si mismo ? Lo cierto es que llevo exactamente 8
> d�as "programando" C, pero no me pega nada que eso pueda ser as�. De
> lo contrario, � cu�ntas variables din�micas puedes declarar ? 2 ? Las
> declaras todas al principio ?
> Creo que no.

Pues s� se produce, aunque sigo pensando que es un poco raro, ya que el 
puntero simplemente acced�a a donde no deb�a (y modificar�a datos
referentes 
a esa informaci�n adicional que imposibilitar�a realizar otra reserva de
forma
correcta). Aunque al menos este detalle me ha permitido detectarlo
realizando 
peticiones de memoria en posiciones determinadas del programa ;-).

> Quiz� es por eso,
> que se pisan los news con los controles de los mallocs ... ?

Debido a que en Linux la zona de Heap no est� limitada en Linux este
problema
no se da, por lo que no creo que sea eso. 

>  no lo
> s�. En fin, espero no haberos vuelto locos y al menos, haberos dado
> alguna idea �til.

S�, no sab�a lo de la diferencia de reserva (aunque supongo que ser� m�s
bien un
tema de implementaci�n).
Re: PROBLEMA DE MEMORIA
#18655
Author: Luis Molina
Date: Wed, 28 Jul 1999 00:00
10 lines
832 bytes
Hola!

Enrique Ferrero wrote:
 
> Como bien dice Cymoril, mezclar malloc y new en C++ es un problema. En todos
> sitios se recomienda new. Parece que es m�s potente y seguro.
> 
> No uses malloc con C++. new es mejor.

Ya, pero es la maldita costumbre por empezar a programar en C.
Re: PROBLEMA DE MEMORIA
#18659
Author: Enrique Ferrero
Date: Thu, 29 Jul 1999 00:00
24 lines
1082 bytes
Luis Molina escribi� en mensaje <379EE6C4.A48E9CD2@redestb.es>...
>Hola!
>
>Enrique Ferrero wrote:
>
>> Como bien dice Cymoril, mezclar malloc y new en C++ es un problema. En
todos
>> sitios se recomienda new. Parece que es m�s potente y seguro.
>>
>> No uses malloc con C++. new es mejor.
>
>Ya, pero es la maldita costumbre por empezar a programar en C.
>

De todas maneras, nadie te ha dicho lo que todos sabemos, que lo mejor para
estos problemas de memoria,
son los �� RABOS DE PASAS !!


X-D


Un saludote.
Re: PROBLEMA DE MEMORIA
#18666
Author: Joseba
Date: Wed, 04 Aug 1999 00:00
29 lines
1668 bytes
Un saludo!

Me he perdido el comienzo del hilo (esto de tabajar no deja tiempo para
casi nada :-( ), as� que igual lo que digo no viene a cuento, pero lo
digo por si acaso.

new y malloc hacen una gesti�n diferente y por separado de la memoria,
con lo cual no es imposible que una llamada malloc pise a una new o
viceversa. Lo de que un malloc se pise a s� mismo... no creo.

Aaaaaaaaaagur.

Luis Molina escribi�:
> 
> Hola!
> 
> Enrique Ferrero wrote:
> 
> > Como bien dice Cymoril, mezclar malloc y new en C++ es un problema. En todos
> > sitios se recomienda new. Parece que es m�s potente y seguro.
> >
> > No uses malloc con C++. new es mejor.
> 
> Ya, pero es la maldita costumbre por empezar a programar en C.

-- 
Joseba G. Torre Segarra
(Para responder, quitar a los PESADOS)
Usuario Linux 93245	M�quina... en casa :o(
Re: PROBLEMA DE MEMORIA
#18669
Author: Luis Molina
Date: Wed, 04 Aug 1999 00:00
29 lines
1638 bytes
Hola!

Joseba wrote:
 
> Un saludo!
> 
> Me he perdido el comienzo del hilo (esto de tabajar no deja tiempo para
> casi nada :-( ), as� que igual lo que digo no viene a cuento, pero lo
> digo por si acaso.

No te preocupes, pasa muy a menudo, as� te puedo responder con lo que
creo
que fu� la conclusi�n l�gica (ya lo he solucionado).
 
> new y malloc hacen una gesti�n diferente y por separado de la memoria,
> con lo cual no es imposible que una llamada malloc pise a una new o
> viceversa. 

Eso s� es cierto.

> Lo de que un malloc se pise a s� mismo... no creo.
 
No es que se pisase a s� mismo, sino que un puntero descontrolado al
sobrescribir zonas de memoria no adecuada (pero dentro de la memoria
del programa) en el que se almacenaba informaci�n importante sobre la
memoria utilizada hac�a que al intentar reservar memoria despu�s con
un malloc fallase inevitablemente, as� que ya sabes, si da un
Segmentation Fault al realizar un malloc estudia los punteros que
utilizas.
Re: PROBLEMA DE MEMORIA
#18622
Author: Dr. Slump
Date: Fri, 06 Aug 1999 00:00
35 lines
1697 bytes
Hombre, el malloc() i el new son muy diferentes entre si, pero eso no
quiere decir que no se puedan utilizar a la vez en el mismo programa, yo lo
hago sin problemas.

Hay que pensar que el malloc() solo reserva memoria, mientras que el new lo
que hace es crear (o instanciar) objetos. Por supuesto para crear un objeto
el new reserva tambien memoria, pero guarda tambien en ella toda la
informacion necesaria para tratar el objeto.

Lo que no se puede hacer es reservar memoria con malloc() i liberarla con
delete, o al reves, crear objetos con new i liberarlos con fre(). Hay que
tener muy claro cuando se reserva con new i cuando con malloc() para luego
liberar en consecuencia.

Esto no es valido:

	char *p;
	p = malloc(10);
	delete p;

I esto tampoco:
	char *p;
	p = new char[10];
	free(p);

El echo de que no sea valido no significa que no compile. De echo no hay
ningun problema al compilar esto. Se esta trabajando siempre con punteros a
char*.
Pero si se hacen las cosas asi, probablemente, en algun momento aparecera
un error de Segmentation Fault. I ya se sabe, luego encuentralo...

---------------------
Ricard
slump@apdo.com
Re: PROBLEMA DE MEMORIA
#18639
Author: franci72
Date: Sun, 08 Aug 1999 00:00
44 lines
2971 bytes
>new y malloc hacen una gesti�n diferente y por separado de la memoria,
>con lo cual no es imposible que una llamada malloc pise a una new o
>viceversa. Lo de que un malloc se pise a s� mismo... no creo.
	Segun creo recordar lei en "C++ manual de referencia" de Herbert
Shildt que el estandar decia que no se aseguraba la compatibilidad
entre ambos, es decir, que no se pedia pedir memoria con new y
liberarla con el free o pedirla con el malloc y usar el delete para
liberarla, porque aunque en algunas implementaciones funcione, todas
aquellas en las que el new se implementa con malloc, podia no hacerlo.
Y si lo piensas bien, si todo el codigo C usa malloc, calloc, realloc
y free ya no podrias usarlo en C++ donde las la mayor parte de clases
estan plagaditas de new. Ahora razonando podemos llegar a esta
conclusi�n por reduccion al absurdo, si metes algun trozo de codigo en
C puro en un programa en C++ (Se supone que debe funcionar o almenos a
mi siempre me ha funcionado si estaba bien hecho) ya no podrias usar
en ninguna ocasi�n new con lo cual, si 90% del codigo en C que tienes
usa malloc y el 90% del codigo en C++ que tienes usa new, solo podrias
usar un 10% de alguno de los dos juntos. Por lo menos para mi llamar a
esto compatibilidad es absurdo.

	Por otro lado siempre puedes redefinir new para que use malloc, lo
cual puedes encontrar en el libro al que he hecho referencia.

	Tambien discrepo con lo que escribio Enrique Ferrero

>> No uses malloc con C++. new es mejor.

	El C++Builder 1.0 usa malloc para new con lo cual solo es de mas
alto nivel no mejor, desconozco como funcionan otros compiladores pero
supongo que si ya tienen un codigo cojonudo para el malloc para que
inventarse otra jugada, usan la misma abstrallendo al programador. El
dia que me digas como se hace un realloc con new y delete, haciendo un
exceso te dare dos besos, uno por mejilla. Hasta entonces, no podras
convencerme de que es mejor, solo mas facil.

Si me equivoco agradeceria que corrigiesis mi error.

Arrepentiros ahora, Gates es el AntiCristo, recitemos
juntos del libro de C de los profetas Kernigan y Ritchie
capitulo 7 versiculo 8.5 : Las funciones malloc y calloc .....
franci72@iname.es (es=>com)
http://members.xoom.com/franci72
P.D. Pa cal� �cija
P.P.D. Pa linux Debian
Re: PROBLEMA DE MEMORIA
#18566
Author: Ignacio Arenaza
Date: Tue, 10 Aug 1999 00:00
45 lines
2655 bytes
>>>>> "franci72" == franci72  <franci72@iname.es> writes:

    franci72> no se podia pedir memoria con new y liberarla con el
    franci72> free o pedirla con el malloc y usar el delete para
    franci72> liberarla, porque aunque en algunas implementaciones...

Esto es lo que dice Schildt y me parece correcto...

    franci72> con malloc, podia no hacerlo.  Y si lo piensas bien, si
    franci72> todo el codigo C usa malloc, calloc, realloc y free ya
    franci72> no podrias usarlo en C++ donde las la mayor parte de
    franci72> clases estan plagaditas de new. Ahora razonando podemos
    franci72> llegar a esta conclusi�n por reduccion al absurdo, si
    franci72> metes algun trozo de codigo en C puro en un programa en
    franci72> C++ (Se supone que debe funcionar o almenos a mi siempre
    franci72> me ha funcionado si estaba bien hecho) ya no podrias
    franci72> usar en ninguna ocasi�n new con lo cual, si 90% del
    franci72> codigo en C que tienes usa malloc y el 90% del codigo en
    franci72> C++ que tienes usa new, solo podrias usar un 10% de
    franci72> alguno de los dos juntos. Por lo menos para mi llamar a
    franci72> esto compatibilidad es absurdo.

Aqui te equivocas de medio a medio. Se puede mezclar malloc y new en
un programa en C++. Lo que no se puede es mezclar malloc con delete o
new con free. Es decir, si reservas con malloc tienes que liberar con
free (y no puedes hacerlo con delete), y si reservas con new tienes
que liberar con delete (y no con free). Esta es la unica restriccion y
lo que dice Schildt segun tu (ver mas arriba). Si respetas esto, tu
"compatibilidad" es del 100%.

De hecho, si lo que tu dices es cierto casi ningun programa hecho en
C++ podria funcionar en Unix/Linux. Porque todos ellos, antes o
despues, usan la libc, que esta hecha 100% en C y usa malloc por todos
los lados ;-)


    franci72> Si me equivoco agradeceria que corrigiesis mi error.

Hecho!! ;-)

Saludos. I�aki.

-- 
  PGP Key available at http://personales.jet.es/inaki.arenaza/pgpkey.html
  Linux Registered User #44369
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads