Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema de punteros, strutcs y arrays

Iniciado por davidgf, 27 de Septiembre de 2007, 01:56:22 PM

« anterior - próximo »

davidgf

Hola,

ya estoy aqui de nuevo para molestaros. El caso es que me ocurre una cosa que no e visto nunca en ningun lugar y nunca antes me habñia ocurrido. Es muy curiosa:

Tengo una struct y un puntero global de ese tipo: arrayButtons


numButtons ++;
if (numButtons == 1) {
arrayButtons = new myButton[1];
}else{
myButton *arrayButtonsTemp;
arrayButtonsTemp=arrayButtons;
arrayButtons = new myButton[numButtons];
CopyMemory(&arrayButtons[0],&arrayButtonsTemp[0], sizeof(myButton)*(numButtons-1));

delete [] arrayButtonsTemp;
}
arrayButtons[numButtons-1].orX = x;
arrayButtons[numButtons-1].orY = y;


Este codigo añade un Boton a la matriz creando memoria, copiando y borrando la vieja (pequeña). I lo que me ocurre es que justo después de ejecutar el delete, un campo de la estructura (solo uno) se modifica:


typedef struct myButton {
float orX,orY;
float orWidth, orHeight;
float x,y;
float width, height;

std::string texture,texturehover;  // este es
std::string b_name;
bool isover;
} myButton;


El texturehover pasa de valer "loquesea.tga" a unos caracteres muy raros. Eso no psa con ninguna otra variable.

El watch chivato me dice que el delete se carga el texturehover

Alguna idea de porque? Esto de la memoria me vuelve loco. He leido el post sobre memroy leak pero no se que utilidad me podria ayudar (uso VS 2005)

Gracias por adelantado!

A por cierto si uso delete sin el [] no va (salta un error) es normal? Hago bien usando los  [] verdad??

EDITO: Al añadir un 3r boton salta un error. Toco memoria que no debo. Deberia usar un puntero a string?? es el string (que tiene tamaño variable) el causante de mis males??
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Titonus

Como bien apuntas, yo apuesto a que es cosa de el tamaño variable de los strings al reservar memoria.

Porque al hacer el CopyMemory, el tamaño fijo/uniforme que pasas a copiar puede estar jugando malas pasadas según los strings de cada elemento del array dinámico. Mira a ver cual es el valor del sizeof que usas y con eso puedes comprobar si van por ahi las cosas.

Para solucionar puedes o bien intentar reservar manualmente (un método) con exactitud el tamaño de tu tipo definido según los carácteres de los strings, o usar arrays de chars de tamaño fijo en vez de strings con las desventajas de esto, o usar arrays de chars pero al reservar manualmente saber su longitud, si usas chars supongo que podrás usar todas esas funciones de conversión de string a char y viceversa, o si no otra idea mejor que se te ocurra.

davidgf

mm

Lo he solucionado cambiandolos por punteros std::string * pero es un poco mas engorroso. Ahora cada vez hago un = new std::string(cadena), i si estoy cambiando el valor uso delete primero.

Supongo que son gages del oficio

Muchas gracias por la info. Imaginava que era eso
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Sante

Y una pregunta, porque no usas la STL en lugar de tener que aumentar el array a mano y copiarlo cada vez que insertas un elemento?

Yo creo que si usaras un std::vector de myButtons y haciendo un push_back para ir añadiendo los elementos te quitarias muchos problemas :roll:

shephiroth

Buenas.

Aparte de los comentarios de usar un vector, hay un error grave en tu codigo que me extraña bastante que no te haya dado error (o quizas es la causa de tu error). Cuando haces "arrayButtons = new myButton[1];", inmediatamente tienes que hacer "arrayButtons[0] = new myButton();". Tanto con tipos simples, como con objetos, cuando haces un new [] estas creando el indice (por asi decirlo) pero en ningun caso reservas la memoria fisica de cada boton.

Como bien te dicen por arriba si utilizas el template de vector te ahorras la gestion de memoria (tienen sus funciones de añadir/borrar elementos) pero entras en otras problematicas de tener que utilizar un objeto para recorrer el vector, y luego tener que castearlo a tu tipo de objeto.

Por ultimo, he leido algo de matriz.....usar vector para almacenar una matriz puede resultar peligroso, sobretodo si las filas tienen nº diferente de columnas.....ten cuidado, los punteros tocan mucho la moral.

SUERTE!!!






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.