[SOLVED] Delete operator vs ~QTreeWidgetItem()
-
Hi,
I would like to know the difference between Delete operator and ~QTreeWidgetItem().
In my code when i use ~QTreeWidgetItem(); no segFault will happen but if use Delete it happens!Here is the code which works fine:
@
itemRename = m_ui->trvConnections->takeTopLevelItem(m_ui->trvConnections->indexOfTopLevelItem(itemRename));
if(itemRename)
{
itemRename->~QTreeWidgetItem();
itemRename = NULL;
}
@And here is the code which leads to segFault:
@
itemRename = m_ui->trvConnections->takeTopLevelItem(m_ui->trvConnections->indexOfTopLevelItem(itemRename));
if(itemRename)
{
delete itemRename;
itemRename = NULL;
}
@Btw: i always(both cases) get below msg in Application output window in takeTopLevelItem() which I don't know why!
"QAbstractItemModel::endRemoveRows: Invalid index ( 0 , 5 ) in model QTreeModel(0x30b4470) " -
To point the obvious, there is a huge diff b/w calling the dtor and using delete - the former does not release the memory of the item itself.
My guess is - the item is already deleted by someone else, like for instance a parent-child relationship. An easy way to test this is a simple qDebug() (and/ or a breakpoint) in the dtor to see when and if it is called.
Also I find it strange the fact that you assign to a pointer you used for a lookup - this can easily be messed up. Also, you don't say at what line there is a segfault.
-
Thanks for your reply.
@
// this function opens text editor for selected item inside treeview
void Preferences::renameConn()
{
.
.
.
// i get selected item in the list inside this function
selectedItem->setFlags(Qt::ItemIsEditable | selectedItem->flags());
QObject::connect(m_ui->trvConnections, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(itemRenamed(QTreeWidgetItem*,int)));
m_ui->trvConnections->editItem(selectedItem, 2);--
}/* when item text is changed i want to delete the item and create a new item with new text */
void Preferences::itemRenamed(QTreeWidgetItem *itemRename, int col)
{
qDebug() << itemRename->text(2); // prints item text successfully
m_ui->
trvConnections->
takeTopLevelItem(m_ui->
trvConnections->
indexOfTopLevelItem(itemRename));
qDebug() << itemRename->text(2); // prints item text successfully
if(itemRename)
{
delete itemRename;
// itemRename->~QTreeWidgetItem();
itemRename = NULL;
}
} // as the function ends i receive a segFault
@ -
It seems the item is used by someone after the function returns and it is not save to delete it in the slot.
Again, does the item have a parent? If yes, this will fail at some point as well.Also, as stated in the docs, it is not save to delete QObject directly because it might receive events later on; you should use deleteLater().
-
As side note, you can take the same TreeWidgetItem and set the text. This will save you from delete and create.
Also when you are using delete, it may be failing to delete the data which is set inside. Since you intent is to remove the item from the widget it has been added, you should use the ~QTreeWidgetItem to avoid this kind of issues.
bq. Invalid index ( 0 , 5 )
This is clear case of using the accessing the item which does not exist in the TreeWidget
-
Hi,
@ mnaydenov, QTreeWidgetItem is not a QObject
-
[quote author="mnaydenov" date="1408878175"] does the item have a parent? If yes, this will fail at some point as well.[/quote]
This is how I make my items:
@
QTreeWidgetItem *sampleItem = new QTreeWidgetItem(m_ui->trvConnections->invisibleRootItem());
m_ui->trvConnections->addTopLevelItem(sampleItem);
@[quote author="mnaydenov" date="1408878175"]
Also, as stated in the docs, it is not save to delete QObject directly because it might receive events later on; you should use deleteLater().
[/quote]
As SGaist stated QTreeWidgetItem is not a QObject so I can't use deleteLater(). -
[quote author="Dheerendra" date="1408881394"]Also when you are using delete, it may be failing to delete the data which is set inside.[/quote]
well I'm afraid this is not the case because I check the memory using memory editor in Qt Creator and as Delete operator gets called the memory value is changed! so Delete is doing it's job.[quote author="Dheerendra" date="1408881394"]
Since you intent is to remove the item from the widget it has been added, you should use the ~QTreeWidgetItem to avoid this kind of issues.[/quote]
So is it alright if i use ~QTreeWidgetItem() instead of delete operator?[quote author="Dheerendra" date="1408881394"]
bq. Invalid index ( 0 , 5 )This is clear case of using the accessing the item which does not exist in the TreeWidget[/quote]
As you can see in the code I've just posted above I'm getting the index from an Item which "itemChanged" signal provided me, if this is the case then that sounds to a bug inside Qt which I'm very skeptical of! -
[quote author="XGuy" date="1408940403"]So is it alright if i use ~QTreeWidgetItem() instead of delete operator?[/quote]
Without delete you will loose memory on each rename. It is not big amount because ~QTreeWidgetItem() deletes its internals. You can verify it my watching an allocated memory for your app and do many renames.
Have you checked a backtrace from a segfault?
What does it show? -
[quote author="andreyc" date="1408943914"][quote author="XGuy" date="1408940403"]So is it alright if i use ~QTreeWidgetItem() instead of delete operator?[/quote]
Have you checked a backtrace from a segfault?
What does it show?
[/quote]Here is the stack trace as requested and bare in mind that sometimes this segFault leads to Qt Creator crash itself!!
Number 55 i mean this line("55 main main.cpp 197 0×30d59f ") points to main.cpp and it reads: return app.exec();0 QObject::destroyed Qt5Cored 0x5b04f441
1 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x648fa5d0
2 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x648f15f0
3 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x648f17cb
4 QObject::destroyed Qt5Cored 0x5b2785df
5 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x648f5a58
6 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x648f7857
7 QObject::destroyed Qt5Cored 0x5b33b210
8 QObject::destroyed Qt5Cored 0x5b33ac41
9 QObject::destroyed Qt5Cored 0x5b3f24f6
10 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x648f2cca
11 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x648f44c8
12 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x648f19c1
13 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x649132b9
14 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x6486f116
15 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x64873c29
16 QObject::destroyed Qt5Cored 0x5b33b210
17 QObject::destroyed Qt5Cored 0x5b33ac41
18 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x64a1e16b
19 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x64913827
20 QObject::destroyed Qt5Cored 0x5b2ecaa3
21 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x64582322
22 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x64581ec5
23 QObject::destroyed Qt5Cored 0x5b2ec814
24 QObject::destroyed Qt5Cored 0x5b2f20c9
25 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x6457d777
26 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x645c6869
27 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x64582472
28 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x6458005b
29 QObject::destroyed Qt5Cored 0x5b2ec814
30 QObject::destroyed Qt5Cored 0x5b3fb938
31 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x6457f455
32 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x645fe34a
33 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x645fd5d1
34 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x6458233e
35 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x6457fe54
36 QObject::destroyed Qt5Cored 0x5b2ec814
37 QObject::destroyed Qt5Cored 0x5b3fb938
38 QInputMethod::localeChanged Qt5Guid 0x65bf6fd4
39 QInputMethod::localeChanged Qt5Guid 0x65bf6809
40 QInputMethod::localeChanged Qt5Guid 0x65bded21
41 QInputMethod::localeChanged Qt5Guid 0x65bdeca9
42 QWindowsGuiEventDispatcher::sendPostedEvents qwindowsguieventdispatcher.cpp 86 0x627edce4
43 QObject::destroyed Qt5Cored 0x5b374a67
44 gapfnScSendMessage USER32 0x75fb62fa
45 GetThreadDesktop USER32 0x75fb6d3a
46 CharPrevW USER32 0x75fb77c4
47 DispatchMessageW USER32 0x75fb788a
48 QObject::destroyed Qt5Cored 0x5b375b53
49 QWindowsGuiEventDispatcher::processEvents qwindowsguieventdispatcher.cpp 78 0x627edc4e
50 QObject::destroyed Qt5Cored 0x5b2e93ec
51 QObject::destroyed Qt5Cored 0x5b2e9552
52 QObject::destroyed Qt5Cored 0x5b2ecd6d
53 QInputMethod::localeChanged Qt5Guid 0x65bf6598
54 QAbstractScrollArea::setHorizontalScrollBarPolicy Qt5Widgetsd 0x6457f9a9
55 main main.cpp 197 0x30d59f
56 WinMain qtmain_win.cpp 131 0x47831a
57 __tmainCRTStartup crtexe.c 547 0x4761d0
58 WinMainCRTStartup crtexe.c 371 0x475f5f
59 BaseThreadInitThunk kernel32 0x7646338a
60 RtlInitializeExceptionChain ntdll32 0x773d9f72
61 RtlInitializeExceptionChain ntdll32 0x773d9f45 -
I see multiple QObject::destroyed for the same address
@
7 QObject::destroyed Qt5Cored 0×5b33b210
16 QObject::destroyed Qt5Cored 0×5b33b210
29 QObject::destroyed Qt5Cored 0×5b2ec814
36 QObject::destroyed Qt5Cored 0×5b2ec814
@
Does it mean that the same object is destroyed or it is an address of the function?
The fact that it crashes QtCreator tells that there is something wrong in the memory handling.I created simple test with delete item;. It removes the entry from QTReeWidget without any crashes.
-
[quote author="andreyc" date="1408995396"]I see multiple QObject::destroyed for the same address
@
7 QObject::destroyed Qt5Cored 0×5b33b210
16 QObject::destroyed Qt5Cored 0×5b33b210
29 QObject::destroyed Qt5Cored 0×5b2ec814
36 QObject::destroyed Qt5Cored 0×5b2ec814
@
Does it mean that the same object is destroyed or it is an address of the function?
[/quote]
The reason for this is that i have sub-classed QtreeWidgetItem and every item holds a button and a checkbox and another pointer to a class. I think these destroy objects simply refer to this.
Anyway I'm sure there is sth wrong with my code and this is no Qt's problem, and Indeed i have changed my code so that it is working. now the item rename takes place in another form.
So i would rather thank u all for being kind and responding to my problem. i think it's high time to mark this thread as solved.