• Jueves 2 de Mayo de 2024, 22:09

Autor Tema:  Acces violation en delete  (Leído 1169 veces)

yusepe1

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Acces violation en delete
« en: Viernes 14 de Agosto de 2009, 22:52 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Acces violation en delete
« Respuesta #1 en: Viernes 14 de Agosto de 2009, 22:59 »
0
¿Y el codigo? ¿Estas usando delete[] array?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

yusepe1

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Acces violation en delete
« Respuesta #2 en: Sábado 15 de Agosto de 2009, 17:41 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Acces violation en delete
« Respuesta #3 en: Sábado 15 de Agosto de 2009, 18:35 »
0
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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

yusepe1

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Acces violation en delete
« Respuesta #4 en: Martes 18 de Agosto de 2009, 01:09 »
0
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.