On Fri, 13 Nov 2009, Pritpal Bedi wrote:

Hi

> Viktor Szakáts wrote:
> > Now I'm getting crash on exit using MinGW + Win7.
> demoxbp.exe ?
> And crash at what point? On exit ? If yes, then it is possibly that 
> HbDbfModel::~HbDbfModel( void )
> {
>    hb_itemRelease( block );
>    destroy();
> }
> needs some overhaul. What I think is that - hb_itemRelease( block ); -
> has to be guarded in someway, but what, I am unable to figure out.
> Przemek can shed light on this aspect.

I think that it's enough if you look at this code more carefully ;-)
This valgrind log should help you.

   ==8925== Invalid read of size 8
   ==8925==    at 0x75D5930: hb_xRefDec (fm.c:840)
   ==8925==    by 0x75D75F5: hb_gcRefFree (garbage.c:313)
   ==8925==    by 0x75D76FF: hb_itemRelease (itemapi.c:174)
   ==8925==    by 0x4568F0: HbDbfModel::~HbDbfModel() (hbqt_slots.cpp:2475)
   ==8925==    by 0x7605406: hb_vmProc (hvm.c:5732)
   ==8925==    by 0x75E19C1: hb_vmExecute (hvm.c:1619)
   ==8925==    by 0x75E414A: hb_vmSend (hvm.c:5880)
   ==8925==    by 0x75E1DA9: hb_vmExecute (hvm.c:1651)
   ==8925==    by 0x75E414A: hb_vmSend (hvm.c:5880)
   ==8925==    by 0x75E1DA9: hb_vmExecute (hvm.c:1651)
   ==8925==    by 0x75E414A: hb_vmSend (hvm.c:5880)
   ==8925==    by 0x7604100: hb_arrayEval (arrays.c:1329)
   ==8925==    by 0x75CE70F: HB_FUN_AEVAL (arrayshb.c:372)
   ==8925==    by 0x7605406: hb_vmProc (hvm.c:5732)
   ==8925==    by 0x75E19C1: hb_vmExecute (hvm.c:1619)
   ==8925==    by 0x75E414A: hb_vmSend (hvm.c:5880)
   ==8925==  Address 0xc18e500 is 0 bytes inside a block of size 72 free'd
   ==8925==    at 0x4C23DD8: free (in 
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
   ==8925==    by 0x75D76FF: hb_itemRelease (itemapi.c:174)
   ==8925==    by 0x4568E7: HbDbfModel::~HbDbfModel() (hbqt_slots.cpp:2292)
   ==8925==    by 0x7605406: hb_vmProc (hvm.c:5732)
   ==8925==    by 0x75E19C1: hb_vmExecute (hvm.c:1619)
   ==8925==    by 0x75E414A: hb_vmSend (hvm.c:5880)
   ==8925==    by 0x75E1DA9: hb_vmExecute (hvm.c:1651)
   ==8925==    by 0x75E414A: hb_vmSend (hvm.c:5880)
   ==8925==    by 0x75E1DA9: hb_vmExecute (hvm.c:1651)
   ==8925==    by 0x75E414A: hb_vmSend (hvm.c:5880)
   ==8925==    by 0x7604100: hb_arrayEval (arrays.c:1329)
   ==8925==    by 0x75CE70F: HB_FUN_AEVAL (arrayshb.c:372)
   ==8925==    by 0x7605406: hb_vmProc (hvm.c:5732)
   ==8925==    by 0x75E19C1: hb_vmExecute (hvm.c:1619)
   ==8925==    by 0x75E414A: hb_vmSend (hvm.c:5880)
   ==8925==    by 0x75E1DA9: hb_vmExecute (hvm.c:1651)

   HbDbfModel::~HbDbfModel( void )
   {
      hb_itemRelease( block );      // hbqt_slots.cpp:2292
      destroy();
   }

   void HbDbfModel::destroy()
   {
      hb_itemRelease( block );      // hbqt_slots.cpp:2475
   }

As you can see this code calls explicitly hb_itemRelease( block ) twice
and it causes memory corruption.

best regards,
Przemek
_______________________________________________
Harbour mailing list (attachment size limit: 40KB)
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to