elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Como puedo depurar un fallo de asignacion de memoria en C++???
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 3 [4] Ir Abajo Respuesta Imprimir
Autor Tema: Como puedo depurar un fallo de asignacion de memoria en C++???  (Leído 14,300 veces)
kafok

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #30 en: 3 Diciembre 2014, 22:44 pm »

Pffff.... al fina que tonteria era, yo creia (habia leido) que los al quitar los privates en este tipo de situaciones no pasaba nada porque al cliente solo le interesa la interfaz por asi decirlo, pero no...

Lo que propone esta pagina su primera sugerencia lo tuve en mente a la hora del diseño de mi libreria, incluso tenia un diseño pensado para hacerle al usuario mas ameno todo en vez de tener que importar a mano la funciones que devuelvan los objetos, pero, pierdo la herencia entre clases de mi dll y clases del cliente que cree mi cliente heredando de la clases, eso no seria posible, ni tampoco casting a traves de constructores, cosas de las cuales no puedo prescindir segun las necesidades de mi problema en cuestion.

Lo primero que se me ocurrio al ver el problema, y conociendo las posivilidades que tengo es obtener el tamaño de la clase con sizeof y declarar en el (.h) del cliente como privado algo tal que:

Código
  1. private:
  2.    char size[/*Aqui lo que devuelva sizeof*/];

Pero la verdad, es bastante chapucero, y tendria que tener cuidado, no es bueno trabajar con numeros magicos. La segunda opcion no la conocia, esta claro que es mi salvacion!! Pero haber entiendo que la parte que pone:
Código
  1. * : smile(new CheshireCat())


sea equivalente a poner:
Código
  1. smile = new CheshireCat();

como primera linea en el constructor de turno, pero esto:
Código
  1. : smile(new CheshireCat(*other.smile))

Es en el constructor copia, el compilador genera automaticamente un constructor copia para el struct?

Ante todo, muchisimas gracias Eternal Idol, no hubiera llegado yo solo a todas esas conclusiones por desconocimiento. Gracias


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #31 en: 3 Diciembre 2014, 23:19 pm »

http://en.cppreference.com/w/cpp/language/initializer_list

El constructor copia es equivalente a:
Código
  1. Handle::Handle(const Handle& other)
  2. {
  3.    smile  = new CheshireCat(*other.smile);
  4.    // do nothing
  5. }

http://en.wikipedia.org/wiki/Copy_constructor

Si, pero ese constructor copia implicito como explica en el enlace de arriba tendria el problema del shallow copy, por eso esta implementado.

Por ejemplo, esto explotaria al llegar al destructor de Handle con el objeto x donde intentaria liberar smile (que apuntaria a la memoria ya liberada al llamar al operador delete con el objeto p).
Código
  1. Handle *p = new Handle;
  2. Handle x = *p;
  3. delete p;

De nadas  ::)


« Última modificación: 3 Diciembre 2014, 23:24 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
kafok

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #32 en: 4 Diciembre 2014, 22:07 pm »

Y vuelven los problemas, aqui hay sitio para todos! vale, no!

Redefini la clase Miclase de la siguiente forma:

Código
  1. class DLL_EXPORT Miclase
  2. {
  3.    private:
  4.        struct OpaquePointer;
  5.        OpaquePointer *op;
  6.  
  7.    public:
  8.        Miclase();
  9.        ~Miclase();
  10. };

y en el .cpp:

Código
  1. struct Miclase::OpaquePointer
  2. {
  3.    string str;
  4. };
  5.  
  6. Miclase::Miclase() : op(new OpaquePointer())
  7. {
  8.    op->str.clear();
  9. }
  10.  
  11. Miclase::~Miclase()
  12. {
  13.    delete op;
  14. }

y mi codigo cliente:

Código
  1. int main()
  2. {
  3.    Miclase ss[21];
  4.    ss[0] = Miclase(); /* AQUI! */
  5.    system("pause");
  6.  
  7.    return 0;
  8. }

La linea que señalo es la que me da problemas, en mi codigo uso la funcion que me recomendaros en este hilo hace tiempo: SetUnhandledExceptionFilter. Y me salta la excepcion, pero si no pongo nada como es el caso del codigo de arriba habria que depurar para darse cuenta de que se lanza una excepcion. La excepcion salta en el destructor del elemento al que se le vuelve a llamar un construnctor por defecto. Depurando paso a paso con mi IDE, en esa linea confilctiva se llama al destructor y se vuelve a construir el nuevo. Si quito la linea y miro para otro lado no pasaria nada, pero hay hay un problema y no se cual es.

Tambien he intentado usar HeapAlloc en vez de new para OpaquePointer pero cada vez que hago alguna operacion con str como el clear crashea, eso si me imagino que habra que personalizar un Allocator pero no estoy seguro de porque falla, solo es una suposicion.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #33 en: 4 Diciembre 2014, 22:55 pm »

ss[0] = Miclase();   /* AQUI! */

No entiendo para que haces eso sinceramente ... ya tenes 21 objetos inicializados correctamente ... ¿Queres crear un objeto temporal y asignarlo/copiarlo en el primer elemento del array? Para que no falle sobrecarga el operador de asignacion como muestra el ejemplo ...

PD. Quiero creer que estas incluyendo la unica definicion que mostras tal cual en el ejecutable.
« Última modificación: 4 Diciembre 2014, 22:57 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
kafok

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #34 en: 5 Diciembre 2014, 19:29 pm »

Ese codigo era de un test de hace tiempo, lo hice asi porque para probar despues constructores con new solo tenia q poner asterisco en la declaracion y poner el new delante asi: ss[0] = new Miclase();

Vale, al tiempo me di cuenta de que el constructor por defecto ahi era una tonteria, pero bueno, resulto que por el simple hecho de estar ahi falla. Se supone que tiene que fallar? Si es asi, ¿Como debo sobrecargar el operadir de asignacion?

Y que hago para que no falle con HeapAlloc, en vez de new,¿Tengo que definor un Allocator o que? Me interesaria tenerlo todo en el mismo heap.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #35 en: 5 Diciembre 2014, 21:22 pm »

Si, pero eso si tiene sentido, si uno tiene punteros a objetos entonces tiene que crear los objetos ...

En fin, en el articulo de la Wikipedia esta sobrecargado, aca tenes las declaracion para tu clase, implementalo en base al articulo:

Código
  1. Miclase& Miclase::operator=(const Miclase &other);

No se que otro fallo tendras ahora, en el ultimo codigo que dejaste con la sobrecarga mencionada no hay ningun fallo.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
kafok

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #36 en: 6 Diciembre 2014, 01:17 am »

aaaaaaaaa!! vale vale, sobrecargue el operador = tal y como dice la pagina, ya entiendo todos los errores que me salian. Es que no entendi muy bien porque sobrecargaba ese operador en la pagina, lo estuve mirando con calma y ya entendi el porque sobrecargarlo, y ya se porque fallaba en ese fragmentito de codigo y mas fallos que daba en mi programa real.

Ya funciona bien!! mi dll ya no da problemas!! a costado, pero al fin fucnionaaaaa!!

Muchisimas gracias
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #37 en: 6 Diciembre 2014, 10:36 am »

De nadas  ::)
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: 1 2 3 [4] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Asignación de memoria en C
Programación C/C++
Akkon 3 4,119 Último mensaje 30 Abril 2011, 15:22 pm
por Akkon
Asignacion Dinamica Memoria
Programación C/C++
charmedever 5 3,742 Último mensaje 21 Octubre 2011, 05:25 am
por charmedever
Problema con asignación dinamica de memoria.
Programación C/C++
ThePinkPanther 9 5,061 Último mensaje 4 Febrero 2013, 00:56 am
por ThePinkPanther
asignacion dinamica de memoria
Programación C/C++
d91 2 2,470 Último mensaje 1 Junio 2014, 05:09 am
por Drewermerc
Depurar la asignacion de memoria.
Programación C/C++
AlbertoBSD 1 1,677 Último mensaje 19 Mayo 2016, 00:28 am
por Stakewinner00
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines