Hello All,

What I did 
========

Pulled code from hbMK2 and placed along hbIDE files
 
   ====================================== 
   #include "hbapi.h"

   #if defined( __cplusplus )

   const char * __hbmk2_hbcppmm( void )
   {
      return "HBCPPMM";
   }

   void * operator new[]( size_t nSize )
   {
      if( nSize == 0 )
         nSize = 1;
HB_TRACE( HB_TR_ALWAYS, ( "              void * operator new[]( size_t %i
)", nSize ) );
      return hb_xgrab( nSize );
   }

   void * operator new( size_t nSize )
   {
      if( nSize == 0 )
         nSize = 1;

      void * pPtr = hb_xgrab( nSize );
HB_TRACE( HB_TR_ALWAYS, ( "              void * operator new( size_t %i )
%p", nSize, pPtr ) );
      return pPtr;
   }

   void operator delete[]( void * ptr )
   {
      if( ptr )
      {
HB_TRACE( HB_TR_ALWAYS, ( "       void operator delete[]( void * %p )", ptr
) );
         hb_xfree( ptr );
HB_TRACE( HB_TR_ALWAYS, ( "              void operator delete[]( void * %p
)", ptr ) );
      }
   }

   void operator delete[]( void * ptr, size_t )
   {
      if( ptr )
      {
HB_TRACE( HB_TR_ALWAYS, ( "       void operator delete[]( void * %p, size_t
)", ptr ) );
         hb_xfree( ptr );
HB_TRACE( HB_TR_ALWAYS, ( "              void operator delete[]( void * %p,
size_t )", ptr ) );
      }
   }

   void operator delete( void * ptr )
   {
      if( ptr )
      {
HB_TRACE( HB_TR_ALWAYS, ( "       void operator delete( void * %p %i)", ptr,
0 ) );
         hb_xfree( ptr );
HB_TRACE( HB_TR_ALWAYS, ( "              void operator delete( void * %p
%i)", ptr, 1 ) );
      }
   }

   void operator delete( void * ptr, size_t nSize )
   {
      if( ptr )
      {
HB_TRACE( HB_TR_ALWAYS, ( "        void operator delete( void * %p, size_t
%i )", ptr, nSize ) );
         hb_xfree( ptr );
HB_TRACE( HB_TR_ALWAYS, ( "              void operator delete( void * %p,
size_t )", ptr ) );
      }
   }

   #endif

   ========================================

Included this file say, cppstub.cpp, in hbIDE.hbp.
Compiled hbIDE => hbmk2 hbide.hbp -l- -lpsapi  -nohbcppmm 

And under various sections of ideeditor.prg and HBQPlainTextEdit.cpp 
I put tracelog. Mainly:


QT_G_FUNC( hbqt_gcRelease_HBQPlainTextEdit )
{
   QGC_POINTER_HBQPlainTextEdit * p = ( QGC_POINTER_HBQPlainTextEdit * )
Cargo;

   if( p && p->bNew )
   {
      if( p->ph && p->pq )
      {
         const QMetaObject * m = ( ( QObject * ) p->ph )->metaObject();
         if( ( QString ) m->className() != ( QString ) "QObject" )
         {
HB_TRACE( HB_TR_ALWAYS, ( "YES_rel_HBQPlainTextEdit
----------------------------------------" ) );
            delete ( ( HBQPlainTextEdit * ) p->ph );
            HB_TRACE( HB_TR_ALWAYS, ( "YES_rel_HBQPlainTextEdit          
ph=%p pq=%p %i B %i KB", p->ph, (void *)(p->pq), ( int ) hb_xquery( 1001 ),
hbqt_getmemused() ) );
            if ( p->ph )
            {
HB_TRACE( HB_TR_ALWAYS, ( "YES_rel_HBQPlainTextEdit           ph=%p
-------------0", p->ph ) );
               delete( p->ph );
HB_TRACE( HB_TR_ALWAYS, ( "YES_rel_HBQPlainTextEdit           ph=%p
-------------1", p->ph ) );
            }
            //p->ph = NULL;
         }
         else
         {
            HB_TRACE( HB_TR_ALWAYS, ( "NO__rel_HBQPlainTextEdit          
ph=%p pq=%p %i B %i KB", p->ph, (void *)(p->pq), ( int ) hb_xquery( 1001 ),
hbqt_getmemused() ) );
         }
      }
      else
      {
         HB_TRACE( HB_TR_ALWAYS, ( "DEL_rel_HBQPlainTextEdit           
Object already deleted!" ) );
      }
   }
   else
   {
      HB_TRACE( HB_TR_ALWAYS, ( "PTR_rel_HBQPlainTextEdit            Object
not created with - new" ) );
      p->ph = NULL;
   }
}

void * hbqt_gcAllocate_HBQPlainTextEdit( void * pObj, bool bNew )
{
   QGC_POINTER_HBQPlainTextEdit * p = ( QGC_POINTER_HBQPlainTextEdit * )
hb_gcAllocate( sizeof( QGC_POINTER_HBQPlainTextEdit ), hbqt_gcFuncs() );

   p->ph = pObj;
   p->bNew = bNew;
   p->func = hbqt_gcRelease_HBQPlainTextEdit;

   if( bNew )
   {
      new( & p->pq ) QPointer< HBQPlainTextEdit >( ( HBQPlainTextEdit * )
pObj );
      HB_TRACE( HB_TR_ALWAYS, ( "   _new_HBQPlainTextEdit           ph=%p %i
B %i KB", pObj, ( int ) hb_xquery( 1001 ), hbqt_getmemused() ) );
   }
   return p;
}

HB_FUNC( QT_HBQPLAINTEXTEDIT )
{
HB_TRACE( HB_TR_ALWAYS, ( "   HB_FUNC( QT_HBQPLAINTEXTEDIT )        0" ) );
   void * pObj = NULL;

   if( hb_pcount() == 1 && HB_ISCHAR( 1 ) )
   {
      pObj = new HBQPlainTextEdit() ;
   }
   else if( hb_pcount() == 1 && HB_ISPOINTER( 1 ) )
   {
      pObj = new HBQPlainTextEdit( hbqt_par_QWidget( 1 ) ) ;
   }
   else
   {
      pObj = new HBQPlainTextEdit() ;
   }

   hb_retptrGC( hbqt_gcAllocate_HBQPlainTextEdit( pObj, true ) );
}


And got the result as:

HBQPlainTextEdit.cpp:146: HB_TR_ALWAYS    HB_FUNC( QT_HBQPLAINTEXTEDIT )       
0
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 100 )
0x38ace78
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 24 )
0x38acf40
HBQPlainTextEdit.cpp:139: HB_TR_ALWAYS    _new_HBQPlainTextEdit          
ph=0x38ace78 2511315 B 48176 KB
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 16 )
0x38b3ba8
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 84 )
0x38c4598

                 // -----------------------------------------------
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 8 )
0x38b0fa0
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 16 )
0x38af1b8
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 4 )
0x38a7db8
cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38af1b8
0)
cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x38af1b8 1)
cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38a7db8
0)
cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x38a7db8 1)
cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38b0fa0
0)
cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x38b0fa0 1)
                 --------------------------------------------------//
DELETED : many entries exactly same to above block with exactly same pointer
reference

cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 4 )
0x38b0fa0

cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 32 )
0x38c6188
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 32 )
0x38c6c00
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 16 )
0x38c6280
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 20 )
0x38ca448
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 16 )
0x38c8998

 idemisc.prg:843:HBIDE_DBG() HB_TR_ALWAYS IdeEdit:destroy()          4

 HBQPlainTextEdit.cpp:100: HB_TR_ALWAYS YES_rel_HBQPlainTextEdit
----------------------------------------
 hbqt_hbqplaintextedit.cpp:100: HB_TR_ALWAYS
HBQPlainTextEdit::~HBQPlainTextEdit()          0
 hbqt_hbqplaintextedit.cpp:102: HB_TR_ALWAYS
HBQPlainTextEdit::~HBQPlainTextEdit()          1
 hbqt_hbqplaintextedit.cpp:104: HB_TR_ALWAYS
HBQPlainTextEdit::~HBQPlainTextEdit()          2
 hbqt_hbqplaintextedit.cpp:106: HB_TR_ALWAYS
HBQPlainTextEdit::~HBQPlainTextEdit()          3
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38acf40
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x38acf40 1)
 hbqt_hbqplaintextedit.cpp:108: HB_TR_ALWAYS
HBQPlainTextEdit::~HBQPlainTextEdit()          4
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38c4598
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x38c4598 1)
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38ace78
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x38ace78 1)
 HBQPlainTextEdit.cpp:102: HB_TR_ALWAYS YES_rel_HBQPlainTextEdit          
ph=0x38ace78 pq=(nil) 2695135 B 51508 KB
 HBQPlainTextEdit.cpp:105: HB_TR_ALWAYS YES_rel_HBQPlainTextEdit          
ph=0x38ace78 -------------0
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38ace78
0)
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x124e988
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x124e988 1)
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x124e918
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x124e918 1)
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x124e8a8
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x124e8a8 1)
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x124e838
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x124e838 1)
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x1210b18
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x1210b18 1)
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x11f4eb8
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x11f4eb8 1)
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x11e6e28
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x11e6e28 1)
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x11ee290
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x11ee290 1)
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x124a7c0
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x124a7c0 1)
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x1248230
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x1248230 1)

                                     GPF

==============================================

The above clubs a life cycle of a Qt objects's creation to destruction.

Note this section:


            if ( p->ph )
            {
HB_TRACE( HB_TR_ALWAYS, ( "YES_rel_HBQPlainTextEdit           ph=%p
-------------0", p->ph ) );
               delete( p->ph );
HB_TRACE( HB_TR_ALWAYS, ( "YES_rel_HBQPlainTextEdit           ph=%p
-------------1", p->ph ) );
            }
            //p->ph = NULL;


If I follow already used method => p->ph = NULL;
then last section :

 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38ace78
0)
 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x124e988
0)
 cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x124e988 1)
 ...
 ...

is never reached, fm logs points to unreleased memory block ( 1 only ).

But when is call => delete( p->ph ) then the above pointers are freed 
but at the point when I expect end of this pointer:

 cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38ace78
0)

which is p->ph itself I get GPF. It is valid because 
    delete ( ( HBQPlainTextEdit * ) p->ph );
has already been issued.

The point to consider deep is : the pointers being freed after 2nd delete
are 
actually obtained when new HBQPlaintTextedit() was called. But how come a 
pointer is triggering the other pointers to be freed when it itself has
already been
freed.

I am unable to consolidate myself an above phenomena. But for sure this is 
EXACTLY what is consuming memory as pointers contained within pointers were 
never being released.

Hope you can pin-point the issue.




-----
                 enjoy hbIDEing...
                    Pritpal Bedi 
_a_student_of_software_analysis_&_design_
-- 
View this message in context: 
http://n2.nabble.com/hbQT-c-stub-GC-Some-food-for-thoughts-tp4483724p4483724.html
Sent from the harbour-devel mailing list archive at Nabble.com.
_______________________________________________
Harbour mailing list (attachment size limit: 40KB)
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to