SoloCodigo
Programación General => C/C++ => Mensaje iniciado por: yusepe1 en Viernes 14 de Agosto de 2009, 22:52
-
Hola gente, tenía un pequeño problema en un delete. Ya que creo una variable dinámica del tipo float y al hacer el delete correspondiente en el destructor, al cerrar el programa me tira un error de acces violation. Lo curioso es que esto sucede cuando el largo del array dinamico es muy largo. Si es lo suficientemente corto no tira este error. Si alguien me puede orientar lo agradecería porque no encuentro como solucionarlo todavia.
Muchas Gracias
Yusepe
-
¿Y el codigo? ¿Estas usando delete[] array?
-
Claro. En una clase que he creado, tengo una variable publica llamada float * array. Luego pido la memoria dinamica al setear el objeto, en el inicio del programa, realizando array = new float[N], donde N es el largo del array. Luego en el destructor realizo delete array, al cerrar el programa. Cuando N no es muy grande, digamos por ej. N = 180000, no hay problema, es decir no tira "Acces Violation", pero si por ej N=550000, al cerrar el programa tira un error en esa linea de "Acces Violation". Ah y otro comentario todavía no entiendo bien la diferencia entre delete array y delete [] array, ya que para N's "chicos" funcionan bien cualquiera de las dos sentencias. Gracias
-
Lo mas probable es que estes corrompiendo la memoria pero es dificil saberlo con tan pocos datos ... podes dejar un dump del error si queres ...
La diferencia es que delete[] llama al destructor de cada objeto del array (aunque en este caso al ser float un tipo primitivo no hay diferencia normalmente PERO eso dependera del entorno - compilador, librerias - ), mejor usa el destructor adecuado ... cuando reserves un array usa delete [] y cuando no usa delete.
-
Entendí lo de los deletes, pero no se que es un "dump del error" ni como se aplica. Mis clases están de la siguiente manera.
class Fragmento
{
public:
void Fragmento();
void Fragmento(int N); //por parametros
void SetFragmento(int N);
.....funciones
....variables
float * array;
}
//En el seteo, pido la memoria haciendo array = new float[N];
//y en el destructor lo borro haciendo delete [] array; o de la otra dorma, me tira el mismo //error con cualquiera de los dos
Después hay otra clase llamada Canal que contiene 1 o varios fragmentos según cuantos archivos lea.
class Canal
{
public:
void Canal();
void SetCanal(int CantFrag, int N);
....funciones
....variables
Fragmento * fragmento;
//En el seteo de Canal, pido alojar dinamicamente CantFrag fragmentos, cada uno con
//de largo para array. Y lo borro al cerrar el programa haciendo delete [] fragmento.
//(A veces me tira error aca tambien ademas, al cerrar el programa)
}
Y asu vez hay una clase Canales que contiene 1 o varios objetos Canal
class Canales
{
void SetCanal(int CantCanales, int CantFrag, int N);
...... funciones
.....variables
Canal * canal;
//Pido la memoria al setearlo haciendo canal = new Canal[CantCanales] y lo borro en el
//destructor haciendo delete [] canal.
}
Espero haber aclarado como es la estructura del programa.