[Kde-perl] Freeing memory used by QTableItem
Oliver Kreuer
okreuer at PSI.de
Mon Aug 30 15:27:56 CEST 2004
Hello,
I tried the last patch but unfortunately I still get the error message
"QGVector::remove: Index -2 out of range" for each element for which I
call Qt::dispose (I can't use the other syntax).
And method Qt::isDisposed always returns false indicating that the
object isn't disposed. So my script constantly eats up memory.
Therefor, is there anything I can do to help solve this problem?
Oliver
Richard Dale wrote:
> On Friday 09 July 2004 12:22, Oliver Kreuer wrote:
>
>>my $junk = Qt::PushButton("Hello World!", undef);
>>Qt::dispose($junk);
>>
>>this works fine. But I tried my example program (see attachment)
>>and I got the following error messages:
>>
>>QGVector::remove: Index -2 out of range
>>QGVector::remove: Index -2 out of range
>
> Yes, that still happens.
>
>
>>Memory fault
>
> He's a version of the patch that works like this:
>
> my $junk = Qt::PushButton("Hello World!", undef);
> $junk->dispose();
> if ($junk->isDisposed()) {
> ...
>
> It also has the fix for the crash problem.
>
> $ cp perlqtdispose_0.2.patch PerlQt-3.008
> $ cd PerlQt-3.008/PerlQt
> $ patch -p1 < ../perlqtdispose_0.2.patch
>
> Then make and install PerlQt
>
> I'm looking into the resize/not updating bug now. I would have thought it was
> a bug in Qt - It also happens in qtruby, but you say it doesn't happen with
> C++ - which is interesting. Hmm..
>
> Trying to help out with perlqt fixes is actually a good way of improving
> qtruby too. Thanks for the example code..
>
> -- Richard
>
>
> ------------------------------------------------------------------------
>
> diff -Naur -X /home/duke/bin/patcher.exclude PerlQt/Qt.pm temp/Qt.pm
> --- PerlQt/Qt.pm 2003-09-09 03:57:11.000000000 +0100
> +++ temp/Qt.pm 2004-07-10 10:21:32.000000000 +0100
> @@ -421,9 +421,13 @@
> my $t = $typename;
> $t =~ s/^const\s+//;
> $t =~ s/(?<=\w)[&*]$//;
> - my $isa = classIsa($argtype, $t);
> - if($isa) {
> - $match{$method} = 0;
> + if ( $argtype eq $t ) {
> + $match{$method} = 1;
> + } else {
> + my $isa = classIsa($argtype, $t);
> + if($isa) {
> + $match{$method} = 0;
> + }
> }
> }
> }
> @@ -1108,4 +1112,17 @@
> return 1
> }
>
> +sub Qt::base::dispose
> +{
> + package Qt::_internal;
> + Qt::_internal::dispose(this());
> + return;
> +}
> +
> +sub Qt::base::isDisposed
> +{
> + package Qt::_internal;
> + return Qt::_internal::isDisposed(this());
> +}
> +
> 1;
> diff -Naur -X /home/duke/bin/patcher.exclude PerlQt/Qt.xs temp/Qt.xs
> --- PerlQt/Qt.xs 2003-09-09 09:41:25.000000000 +0100
> +++ temp/Qt.xs 2004-07-10 10:21:25.000000000 +0100
> @@ -999,6 +999,7 @@
> SvREFCNT_dec(sv_this);
> sv_this = old_this;
> }
> + o->allocated = false;
> if( ret && (do_debug & qtdb_gc) )
> fprintf(stderr, "Increasing refcount in DESTROY for %s=%p (still has a parent)\n", package, o->ptr);
> } else {
> @@ -1492,7 +1493,12 @@
> CODE:
> Smoke::Method &m = qt_Smoke->methods[method];
> Smoke::Index *args = qt_Smoke->argumentList + m.args;
> - RETVAL = (char*)qt_Smoke->types[args[idx]].name;
> + if ((qt_Smoke->types[args[idx]].flags & 0x0f) == Smoke::t_enum) {
> + // Just treat enums as longs, don't bother matching on the enum name
> + RETVAL = "long";
> + } else {
> + RETVAL = (char*)qt_Smoke->types[args[idx]].name;
> + }
> OUTPUT:
> RETVAL
>
> @@ -1743,6 +1749,44 @@
> delete qobj;
>
> void
> +dispose(obj)
> + SV *obj
> + CODE:
> + smokeperl_object *o = sv_obj_info(obj);
> + if(!o || !o->ptr) {
> + XSRETURN_EMPTY;
> + } else {
> + const char *className = o->smoke->classes[o->classId].className;
> + char *methodName = new char[strlen(className) + 2];
> + methodName[0] = '~';
> + strcpy(methodName + 1, className);
> + Smoke::Index nameId = o->smoke->idMethodName(methodName);
> + Smoke::Index meth = o->smoke->findMethod(o->classId, nameId);
> + if(meth > 0) {
> + Smoke::Method &m = o->smoke->methods[o->smoke->methodMaps[meth].method];
> + Smoke::ClassFn fn = o->smoke->classes[m.classId].classFn;
> + Smoke::StackItem i[1];
> + (*fn)(m.method, o->ptr, i);
> + }
> + delete[] methodName;
> + o->ptr = 0;
> + o->allocated = false;
> + }
> +
> +bool
> +isDisposed(obj)
> + SV *obj
> + CODE:
> + smokeperl_object *o = sv_obj_info(obj);
> + if(!o || !o->ptr) {
> + RETVAL = 0;
> + } else {
> + RETVAL = 1;
> + }
> + OUTPUT:
> + RETVAL
> +
> +void
> mapObject(obj)
> SV *obj
> CODE:
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Kde-perl mailing list
> Kde-perl at kde.org
> https://mail.kde.org/mailman/listinfo/kde-perl
More information about the Kde-perl
mailing list