Hi Mark,
Thanks for this. So the short answer was that I had indeed made a
fundamental error. I should update PM.
Maybe I knew all this once upon a time, but I had definitely forgotten
it long since!! It explains why I had leaks all over the place. Some
of which must have been quite big because of embedded scrolling photos
and other stuff.
Can I just clarify what is meant by "toplevel". I guess it means
anything that groups controls that you would normally expect to disapear
because of going out of scope: any Dialog, Panel or Frame with children
or indeed a tree of descendants. Or does it just mean the application
main frame?
And if a whole tree goes out of scope simultaneously, eg controls in
sizers on panels within panels in a dialog, is it enough to Destroy the
dialog?
Thanks again,
Regards,
Steve.
On 11/05/15 11:52, Mark Dootson wrote:
Hi,
See
http://docs.wxwidgets.org/3.0/classwx_window.html#a6bf0c5be864544d9ce0560087667b7fc
details for wxWindow::Destroy.
As you have determined, top level windows you create need to be
destroyed with $win->Destroy;
The C++ structure for a Wx::Frame contains a reference to the
associated Perl SV. So that SV won't go away until the C++ structure
is deleted - which will never happen until your event loop is running.
Hope this helps.
Mark
On 11/05/2015 14:32, Steve Cookson wrote:
Hi Guys,
I started to talk about this on Perl Monks, you may have seen it here:
http://www.perlmonks.org/?node_id=1125580
An anonymous monk posted some code that showed just about every call
to Wx leaking a scalar or two. I've played about with the posted
code and there is a copy attached to this email.
The main part of the code, here:
$count1 = Devel::Leak::NoteSV($handle);
for(1..100){
my $f=Wx::Frame->new( undef ,-1,"goner" );
my $p=Wx::Panel->new (undef ,-1 );
#my $b=Wx::Button->new ( $f ,-1 );
#my $t=Wx::TextCtrl->new($f, -1, "");
#$t->Destroy;
#$b->Destroy;
#$i->Destroy;
$p->Destroy;
$f->Destroy;
}
$count2 = Devel::Leak::CheckSV($handle);
seems to show that if you do not ->Destroy a Wx object, it will not
go out of scope naturally and even if you do destroy a Wx::Frame
object, it will not go out of scope. The monk also tried Weaken and
undef, with the same results.
Please have a look at this and make sure that I have not (or the
Anonymous Monk has not), made some fundamental error.
I have checked it both in 2.8.11 and 3.0.2 with the same results.
I look forward to hearing your feedback,
Regards
Steve.