[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