Re: Freeing memory used by QTableItem

Oliver Kreuer <[email protected]>
Newsgroups gmane.comp.kde.devel.perl
Message-ID <[email protected]>
Hello,

thank you for your patch. With

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
Memory fault

I also used Qt::debug qw(all) which printed:
...
...
In XS Autoload for Qt::TableItem::QTableItem()
Calling method  QTableItem* QTableItem::QTableItem(QTable*, 
QTableItem::EditType, const QString&)
with arguments (QTable, '0', '497')
In XS Autoload for Qt::TableItem::Never()
Calling method  static QTableItem::EditType QTableItem::Never()
with arguments ()
In XS Autoload for Qt::TableItem::QTableItem()
Calling method  QTableItem* QTableItem::QTableItem(QTable*, 
QTableItem::EditType, const QString&)
with arguments (QTable, '0', '498')
In XS Autoload for Qt::TableItem::Never()
Calling method  static QTableItem::EditType QTableItem::Never()
with arguments ()
In XS Autoload for Qt::TableItem::QTableItem()
Calling method  QTableItem* QTableItem::QTableItem(QTable*, 
QTableItem::EditType, const QString&)
with arguments (QTable, '0', '499')
0x8550e78->~QTableItem()
virtual 0x8524390->QTable::takeItem() called
In XS Autoload for Qt::Table::takeItem()
Calling method  void QTable::takeItem(QTableItem*)
with arguments (QTableItem)
virtual 0x8524390->QTable::cellGeometry() called
virtual 0x8524390->QTable::item() called
virtual 0x8524390->QTable::columnPos() called
virtual 0x8524390->QTable::rowPos() called
virtual 0x8524390->QTable::columnWidth() called
virtual 0x8524390->QTable::rowHeight() called
virtual 0x8524390->QTable::numRows() called
virtual 0x8524390->QTable::numCols() called
virtual 0x8524390->QTable::numCols() called
QGVector::remove: Index -2 out of range
In XS Autoload for Qt::TableItem::DESTROY()
In XS Autoload for Qt::TableItem::table()
Calling method  QTable* QTableItem::table() const
with arguments ()
Deleting (QTableItem*)0x8550e78
0x8550db8->~QTableItem()
virtual 0x8524390->QTable::takeItem() called
In XS Autoload for Qt::Table::takeItem()
Calling method  void QTable::takeItem(QTableItem*)
with arguments (QTableItem)
virtual 0x8524390->QTable::cellGeometry() called
virtual 0x8524390->QTable::item() called
virtual 0x8524390->QTable::columnPos() called
virtual 0x8524390->QTable::rowPos() called
virtual 0x8524390->QTable::columnWidth() called
virtual 0x8524390->QTable::rowHeight() called
virtual 0x8524390->QTable::numRows() called
virtual 0x8524390->QTable::numCols() called
virtual 0x8524390->QTable::numCols() called
QGVector::remove: Index -2 out of range
In XS Autoload for Qt::TableItem::DESTROY()
In XS Autoload for Qt::TableItem::table()
Calling method  QTable* QTableItem::table() const
with arguments ()
Deleting (QTableItem*)0x8550db8
0x85513b8->~QTableItem()
virtual 0x8524390->QTable::takeItem() called
Memory fault

Unfortunately I don't know what this means.

Oliver

Richard Dale wrote:
> Actually that patch doesn't work I'm afraid. Here's another one, but it still 
> isn't right. This works:
> 
> my $junk = Qt::PushButton("Hello World!", undef);
> Qt::dispose($junk);
> 
> But what I was really trying to do was this:
> 
> my $junk = Qt::PushButton("Hello World!", undef);
> $junk->dispose();
> 
> I can't work out how to do that..
> 
> -- Richard
> 
> 
> On Friday 09 July 2004 04:48, Richard Dale wrote:
> 
>>I recently had a similar problem with the qtruby bindings ( which are based
>>on the perlqt code), and I solved it be adding 'dispose()' and
>>'isDisposed()' methods. Please find attach a patch for PerlQt 3.008 which
>>adds the same methods.
>>
>>$ cp perlqtdispose.patch PerlQt-3.008/PerlQt
>>$ cd PerlQt-3.008/PerlQt
>>$ patch Qt.xs -p0 < perlqtdispose.patch
>>
>>Then make and install PerlQt..
>>
>>-- Richard
>>
>>On Monday 05 July 2004 14:51, Oliver Kreuer wrote:
>>
>>>Hello,
>>>
>>>how can I free memory used by an object of class Qt::TableItem myself?
>>>I've read that takeItem only removes an item from an existing table
>>>without destroying the Qt::TableItem object.
>>>So since I can't simply say "delete <object>" in Perl I tried the
>>>following:
>>>
>>>my @t = ();
>>>for (my $i=0 ;$i<1000 ;$i++ )
>>>{
>>>      $t[$i] = Qt::TableItem(table,&Qt::TableItem::Never,"$i");
>>>}
>>>
>>>sleep(10);
>>>
>>>for (my $i=0 ;$i<1000 ;$i++ )
>>>{
>>>    $t[$i] = "";
>>>}
>>>
>>>But "top" shows me that memory usage after the last loop increases
>>>instead of decreases.
>>>
>>>Thanks for your help,
>>>Oliver
>>>
>>>
>>>_______________________________________________
>>>Kde-perl mailing list
>>>[email protected]
>>>https://mail.kde.org/mailman/listinfo/kde-perl
>>>
>>>
>>>------------------------------------------------------------------------
>>>
>>>--- Qt.xs.save	2004-07-09 04:29:16.000000000 +0100
>>>+++ Qt.xs	2004-07-09 08:43:41.000000000 +0100
>>>@@ -1388,6 +1388,7 @@
>>>     QByteArray *s = (QByteArray*) tmp;
>>>     delete s;
>>> 
>>>+
>>> # --------------- XSUBS for Qt::_internal::* helpers  ----------------
>>> 
>>> 
>>>@@ -1746,7 +1747,7 @@
>>>     if(!o) { XSRETURN_EMPTY; }
>>>     QObject *qobj = (QObject*)o->smoke->cast(o->ptr, o->classId, o->smoke->idClass("QObject"));
>>>     delete qobj;
>>>-
>>>+	
>>> void
>>> mapObject(obj)
>>>     SV *obj
>>>@@ -2119,6 +2120,44 @@
>>>     OUTPUT:
>>>     RETVAL
>>> 
>>>+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
>>>+
>>> BOOT:
>>>     init_qt_Smoke();
>>>     qt_Smoke->binding = new QtSmokeBinding(qt_Smoke);
>>>
>>>
>>>------------------------------------------------------------------------
>>>
>>>_______________________________________________
>>>Kde-perl mailing list
>>>[email protected]
>>>https://mail.kde.org/mailman/listinfo/kde-perl

-- 
Oliver Kreuer
PSI AG
Bernsaustrasse 4-6
42553 Velbert (Neviges)

Telefon +49/2053/919-211
Telefax +49/2053/919-194
E-Mail  [email protected]

_______________________________________________
Kde-perl mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/kde-perl
table3.pl (application/x-perl, 5.6 KB)
#!/usr/bin/perl -w

# Form implementation generated from reading ui file 'table_example.ui'
#
# Created: Mon Jul 5 09:38:35 2004
#      by: The PerlQt User Interface Compiler (puic)
#
# WARNING! All changes made in this file will be lost!

BEGIN
{
		unshift (@INC,"/usr/local/lib");
}

use strict;
use utf8;
use Qt::debug qw(all);

package table_example;
use Qt;
use Qt::isa qw(Qt::Widget);
use Qt::slots
    tableOneRow => [],
    tableTwoRows => [];
use Qt::attributes qw(
    frame6
    One_Row
    table
    Two_Rows
);

our $filled = "false";

sub NEW
{
    shift->SUPER::NEW(@_[0..2]);

    if ( name() eq "unnamed" )
    {
        setName("table_example" );
    }

    my $table_exampleLayout = Qt::GridLayout(this, 1, 1, 11, 6, '$table_exampleLayout');

    frame6 = Qt::Frame(this, "frame6");
    frame6->setFrameShape( &Qt::Frame::StyledPanel() );
    frame6->setFrameShadow( &Qt::Frame::Raised() );
    my $frame6Layout = Qt::GridLayout(frame6, 1, 1, 11, 6, '$frame6Layout');
    my $spacer = Qt::SpacerItem(190, 20, &Qt::SizePolicy::Expanding, &Qt::SizePolicy::Minimum);
    $frame6Layout->addItem($spacer, 1, 3);

    One_Row = Qt::PushButton(frame6, "One_Row");

    $frame6Layout->addWidget(One_Row, 1, 1);

    table = Qt::Table(frame6, "table");
    table->setNumRows( int(0) );
    table->setNumCols( int(0) );
    table->setReadOnly( 1 );
    table->setSelectionMode( &Qt::Table::NoSelection() );
    table->setLeftMargin(0);                               # don't show left vertical header

    $frame6Layout->addMultiCellWidget(table, 0, 0, 0, 3);

    Two_Rows = Qt::PushButton(frame6, "Two_Rows");

    $frame6Layout->addWidget(Two_Rows, 1, 2);
    my $spacer_2 = Qt::SpacerItem(190, 20, &Qt::SizePolicy::Expanding, &Qt::SizePolicy::Minimum);
    $frame6Layout->addItem($spacer_2, 1, 0);

    $table_exampleLayout->addWidget(frame6, 0, 0);
    languageChange();
    my $resize = Qt::Size(586, 482);
    $resize = $resize->expandedTo(minimumSizeHint());
    resize( $resize );
    clearWState( &Qt::WState_Polished );

    Qt::Object::connect(One_Row, SIGNAL "clicked()", this, SLOT "tableOneRow()");
    Qt::Object::connect(Two_Rows, SIGNAL "clicked()", this, SLOT "tableTwoRows()");
}


#  Sets the strings of the subwidgets using the current
#  language.

sub languageChange
{
    setCaption(trUtf8("Table Test") );
    One_Row->setText( trUtf8("One Row") );
    Two_Rows->setText( trUtf8("Two Rows") );
}


sub tableOneRow
{
		my @lines = ();
		
		$filled = "true";

    open (FILE,"table_example.one") or die;
    while (defined (my $line = <FILE>))
    {
        chomp($line);
        push (@lines,$line);
        
        clearTable();
        
        table->setNumCols(1);
        table->horizontalHeader()->setStretchEnabled(1);
        table->horizontalHeader()->setClickEnabled(0,-1);
        table->horizontalHeader()->setLabel(0,"Eine Spalte",-1);
        table->setNumRows(scalar(@lines));
				table->setFocusPolicy( &Qt::Table::NoFocus() );
        
#				my $junk = Qt::PushButton("Hello World!", undef);
#				sleep(10);
#				Qt::dispose($junk);

				my @t = ();
				for (my $i=0 ;$i<500 ;$i++ )
				{
						$t[$i] = Qt::TableItem(table,&Qt::TableItem::Never,"$i");
				}
				
				for (my $i=0 ;$i<500 ;$i++ )
				{
						Qt::dispose($t[$i]);
				}


        my $row = 0;
        foreach my $element (@lines)
        {
            table->setItem($row,0,Qt::TableItem(table,&Qt::TableItem::Never," $element"));
            $row++;
        }								
    }				
}

sub tableTwoRows
{
    my @col1 = ();
		my @col2 = ();

		$filled = "true";

    open (FILE,"table_example.two") or die;
    while (defined (my $line = <FILE>))
    {
        chomp($line);
				my @parts = split/\s+/,$line;
        push (@col1,$parts[0]);
        push (@col2,$parts[1]);
        
        clearTable();
        
        table->setNumCols(2);
        table->horizontalHeader()->setStretchEnabled(1);
        table->horizontalHeader()->setLabel(0,"Erste Spalte",-1);
        table->horizontalHeader()->setLabel(1,"Zweite Spalte",-1);
        table->horizontalHeader()->setClickEnabled(0,-1);
        table->setNumRows(scalar(@col2) > scalar(@col1) ? scalar(@col1) : scalar(@col2));
				table->setFocusPolicy( &Qt::Table::NoFocus() );
        
#				my $junk = Qt::PushButton("Hello World!", undef);
#				sleep(10);
#				Qt::dispose($junk);								

				my @t = ();
				for (my $i=0 ;$i<500 ;$i++ )
				{
						$t[$i] = Qt::TableItem(table,&Qt::TableItem::Never,"$i");
				}
				
				for (my $i=0 ;$i<500 ;$i++ )
				{
						Qt::dispose($t[$i]);
					}
				
				

        my $row = 0;
        foreach my $element (@col1)
        {
            table->setItem($row,0,Qt::TableItem(table,&Qt::TableItem::Never," $element"));
            $row++;
        }

				$row = 0;
        foreach my $element (@col2)
        {
            table->setItem($row,1,Qt::TableItem(table,&Qt::TableItem::Never," $element"));
            $row++;
        }				
    }				
}


sub clearTable 
{
    if (table->numRows() > 0)
    {
        if (table->numCols() > 1)
        {
            for (my $elem = 0; $elem < table->numRows() ;$elem++ )
            {
                table->takeItem(table->item($elem,0));
                table->takeItem(table->item($elem,1));
            }
        }
        else
        {
            for (my $elem = 0; $elem < table->numRows() ;$elem++ )
            {
                table->takeItem(table->item($elem,0));
            }
        }                       
    }
}


sub resizeEvent 
{
 		if ($filled eq "true")
 		{
				table->updateContents();
 		}
}



1;


package main;

use Qt;
use table_example;

my $a = Qt::Application(\@ARGV);
my $w = table_example;
$a->setMainWidget($w);
$w->show;
exit $a->exec;
table_example.one (text/plain, 19 B)
One
Two
Three
Four
table_example.two (text/plain, 32 B)
1_1	1_2
2_1	2_2
3_1	3_2
4_1	4_2
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.