Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Error De Protección De Memoria De Los...··$%~#

Iniciado por Haddd, 23 de Febrero de 2004, 08:42:08 PM

« anterior - próximo »

Haddd

 
// Si la posición supera al nº actual, aumentamos el array
if(m_NumAtributos<Num) {

 cxAtributos *s=new cxAtributos[Num];

 // Copiamos los que había
 if(m_NumAtributos>0) {

  memcpy(s,m_Atributos,sizeof(cxAtributos)*m_NumAtributos);

  delete []m_Atributos;
 }

 m_Atributos=s;

 m_NumAtributos=Num;
}


Es muy simple y debería funcionar. Pero al cerrar el programa, salta el depurador con protección de memoria. Y si quito el delete[], no me salta el depurador, aunque me quedo con memory leaks!.

Zaelsius

  Yo usaria la notación m_pXXX para las variables miembro punteros, porque es un lio  :P  

fiero

 ¿Por qué pones esto así?

delete []m_Atributos;

para liberar un puntero es simplemente:

delete m_Atributos;

¿no?

PD: Al cerrar el programa ¿te salta el error en el "delete m_Atributos;" que has puesto en el destructor?
Asegurate de que solo utilizas hasta m_Atributos[m_NumAtributos-1], ya sé que es un error muy básico, pero una vez me pasó a mi que utilizaba un elemento más de los que habia reservado y en vez de dar el error al utilizar esa memoria sin reservar, daba el error al intentar liberar el vector. A veces se mete la pata en las cosillas más simples...
www.videopanoramas.com Videopanoramas 3D player

MChiz

 Hola, buens!

Podria ser que Num valga 0? Si es asi, estarias haciendo un new de 0 elementos!
Prueba de hacer el new dentro del if anidado.

Un saludote!!

samsaga2

 cxAtributos es un struct o una clase? Si es una clase ni se te ocurra hacer un memcpy porque no funcionara.

Haddd

 MChiz:
Num no vale 0 nunca.

fiero:
delete [] se utiliza para liberar memoria de un array de elementos. Y no me paso de rango en el array.

Zaelsius:Debería hacerlo, pero...la costumbre....

Samsaga:
Es una estructura que mide 88 bytes.

Y en teoría puedo hacer un memcpy si la clase no tiene clases virtuales.

CoLSoN2

  // Si la posición supera al nº actual, aumentamos el array
if(m_NumAtributos<Num) {

cxAtributos *s=new cxAtributos[Num];

// Copiamos los que había
if(m_NumAtributos>0) {

 memcpy(s,m_Atributos,sizeof(cxAtributos)*m_NumAtributos);

 delete []m_Atributos;
}

hm.. aquí estás haciendo un memcpy de m_numAtributos, cuando s es de tamaño Num. donde miras que sean iguales? dejas atributos vacios entonces?
P.D pon el codigo donde creas m_Atributos :P
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

Haddd

 m_numAtributos siempre es menos que Num.

En realidad lo que estoy haciendo es un realloc, pero no sé cómo hacerlos utilizando new y delete, no existe un renew.

DraKKaR

 Si quieres un vector de elementos, ¿porqué no utilizas std::vector y te olvidas de todos esos problemas?
Yo al principio era reacio a usarlo, pero ahora los he puesto en todos los sitios que necesito arrays de elementos y van de perlas. Y no he perdido ni un FPS de rendimiento. Los aconsejo encarecidamente, porque el cuello de botella no va a ser el acceso al array, sino el render en nuestro caso.
Si aun así no quieres usar la STL, prueba con los auto pointers de la libreria boost, que te liberan la memoria cuando toca.

TheAzazel

 Hola Haddd,
vi el codigo y no encontre nada q extraño (aunq stoy empanao asiq.. jajaja), es una lastima q no tengamos un "renew" o algo similar pero asi esta el patio... jejeje.
He cogido tu codigo y lo he metido en un miniprograma y a ejecutar! a mi no solo me funciona bien si no q ademas le he puesto un control de memory leaks por si algo no iba bien y todo OK. Si andas con punteros y tal... a veces eso pude fallar pq la cosa viene de antes... quizas algun puntero o algo ha desbordado y ha escrito dnd no debia y por eso al liberar casca(como siempre). Estos son los errores q odio y temo... intenta toquetear por tu codigo a ver si das con ello, en algun sitio copias mas de la cuenta o cosas similares.
De todas formas, aqui va el codigo para q lo pruebes:


#include <windows.h>
#define CRTDBG_MAP_ALLOC
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

void main()
{
typedef struct cxAtributos
{
 char data[88];
};
int m_NumAtributos;
int Num;
cxAtributos *m_Atributos;

// Inicio variables
m_NumAtributos=4;
Num=5;
m_Atributos=new cxAtributos[m_NumAtributos];

// Si la posición supera al nº actual, aumentamos el array
if(m_NumAtributos<Num)
{
 cxAtributos *s=new cxAtributos[Num];

 // Copiamos los que había
 if(m_NumAtributos>0)
 {
  memcpy(s,m_Atributos,sizeof(cxAtributos)*m_NumAtributos);
  delete []m_Atributos;
 }
 m_Atributos=s;
 m_NumAtributos=Num;
}

// Final
delete []m_Atributos;
   _CrtDumpMemoryLeaks(); // algun memory leaks?
}


Me he inventado las cosas mas o menos como indicas, espero q des con ello pronto!
suerte

Haddd

 Gracias a todos. Suponía que estaba bien y el problema vendrá de lo que comentaba Azazel, quizás sea otro trozo de código que está escribiendo aquí y me fastidia. Lo puse aquí para ver si alguien veía algo mal, pero parece que todo es correcto. :(  

DraKKaR

 A mi me pasaba algo parecido, y lo que me jodía era que intentaba crear una instancia de un objeto que estaba definido E implementado en un DLL desde otro EXE. Eso hacía que la liberar esa memoria desde el EXE me cascaba.
La solución fue hacer el new dentro del DLL (del módulo donde esa clase esté definida e implementada).

Haddd

 Bueno, lo he resuelto y lo expongo aquí para que no le pase a otro  <_<

El problema era el memcpy, lo he sustituido por:

for(DWORD c=0;c    s[c]=m_Atributos[c];

Se ve que quizás el problema estaba en que es posible que el new me esté generando múltiplos de 32 para cada objeto o algo parecido. El tamaño de cxAtributos es 88, así que esta puede ser la pega, porque si no no sé que puñetas puede ser.  :blink:

olé: (ole)  






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.