• Domingo 15 de Diciembre de 2024, 19:04

Autor Tema:  Heaps  (Leído 997 veces)

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Heaps
« en: Miércoles 25 de Marzo de 2009, 12:38 »
0
Buenas:

Tengo una aplicación que emplea una dll hecha por mi.
Esta dll realiza unas operaciones interpretando comandos en ascii que se le mandan. Cuando realiza la operación devuelve otro comando con la respuesta.

Para ello he hecho una funcion :

Código: C++
  1.  
  2. GPROTOCOL_API DWORD Execute(const std::string command,std::string * response)
  3. {
  4. std::string s;
  5.  
  6.     s="config";
  7.     if (command.compare(0,s.size(),s)==0)
  8.     {
  9.         *response="0 OK CONFIG";
  10.         int r=0;
  11.         return r;  
  12.     }
  13. }
  14.  
  15.  


este cacho de codigo me produce un assert _CrtIsValidHeapPointer al retornar. El cacho de codigo esta en una dll y al debuguear se ejecuta correctamente hasta que llega al return r;

Segun msdn , dice que el acceso a memoria que realizo no esta dentro del heap.

Es debido al puntero que paso como response?
como puedo forzar a la dll a usar el heap del proceso localizador?

normalmente si localizara algo en la dll usaria HeapAlloc  pero aqui estoy pasando un std::string estatico desde el proceso que linka la dll.

Gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Heaps
« Respuesta #1 en: Miércoles 25 de Marzo de 2009, 13:42 »
0
Supongo que como tu string response del llamador no tiene memoria reservada la DLL hace la reserva con su propio heap, al salir tu variable de ambito hace la liberacion del puntero pero con otro heap.

Fijate que pasa si haces un reserve(255); sobre la variable antes de Execute (es solo para probar, el punto es que tenes siempre que reservar/liberar con el mismo heap).

Para usar el heap del programa tendrias que pasarlo como parametro ... pero no es una solucion muy limpia que digamos ...

Código: Text
  1. extern "C" void *crtheap;
  2.  

La mas probable solucion sera que response sea un doble puntero (**) y reserves/liberes su memoria en dos funciones de la DLL.

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.

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Heaps
« Respuesta #2 en: Miércoles 1 de Abril de 2009, 18:22 »
0
buenas, siento tardar en responder, una semana infernal.

Pues llevaba desde la semana pasada detras de este bug.
Tenias razón con lo del reserve, ya que la excepción se producia cuando los std::strings intentaban liberar la memoria localizada durante el procesamiento en la dll.
Hacer el reserve no me servia, por que estaba empleando los literales como parametros std:string y entonces me requeria modificar muchisimo codigo, asi que lo he pasado de (std::string, std::string *) a un simple (const char *,char *)  y cambiado las funciones internas por strcmp y se ha arreglado.

Muchas gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Heaps
« Respuesta #3 en: Miércoles 1 de Abril de 2009, 18:28 »
0
De nadas  B)

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.