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