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