【发布时间】:2016-12-12 06:58:40
【问题描述】:
我的表格视图每一行的最后一列都有一个删除按钮(QPushButton)。我正在创建这些按钮并直接将它们设置在视图中。由于我已经动态分配了内存,我希望释放这些内存,但我没有在任何地方存储这些按钮的指针,所以我试图在清理和删除它们时获取小部件。
SDelegate* myDelegate;
myDelegate = new SDelegate();
STableModel* model = new STableModel(1, 7, this);
myWindow->tableView->setModel(model);
myWindow->tableView->setItemDelegate(myDelegate);
for(int i = 0; i < no_of_rows; ++i) {
QPushButton* deleteButton = new QPushButton();
myWindow->tableView->setIndexWidget(model->index(i, 6), deleteButton);
}
exec();
// Cleanup
for(int i = 0; i < no_of_rows; ++i) {
// code works fine on removing this particular section
QWidget* widget = myWindow->tableView->indexWidget(model->index(i, 6));
if (widget)
delete widget;
}
delete model;
delete myDelegate;
我在 qt5cored.dll 中遇到崩溃(未处理的异常),并且应用程序在 qcoreapplication.h 中崩溃,代码如下:
#ifndef QT_NO_QOBJECT
inline bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)
{ if (event) event->spont = false; return self ? self->notifyInternal(receiver, event) : false; }
在调试时,删除这些小部件没有问题,但之后代码在其他某个时间点崩溃。我正在为继承了 QAbstractTableModel 的模型使用 QTableView 和自定义类。
【问题讨论】:
-
如果您正确设置了您不需要(或不想)手动删除小部件的父级。家长会替你处理的。您可能在这里造成了双重删除。编辑:实际上删除您出于相同原因发布的代码示例中的所有删除!
-
你试过在调试器下运行吗?异常发生时的调用栈是什么样的?
-
@drescherjm 代码在删除删除小部件语句时工作得非常好。由于我使用 new 来分配内存,我认为我需要自己删除它。如何确认分配给按钮的内存稍后被释放?
-
@rustyx 是的,我在调试器下尝试过,所有代码都来自最近调用堆栈中的不同 DLL,我已经发布了 qcoreappliation 崩溃的代码段
-
您不需要删除任何内容。这是 2016 年。让编译器处理对象的生命周期。按值保存对象,而不是按指针。