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)
[email protected]
http://lists.harbour-project.org/mailman/listinfo/harbour