是否可以删除取消引用的指针
Is it possible to delete a dereferenced Pointer
我有一些遗留代码,其中对象是动态分配然后发出的:
QList<MyClass *> *list = new QList<MyClass *>();
...
emit listReady(*row);
void OtherClass::slotList(QList<MyClass> list) {
...
delete list???
}
我可以删除列表中的对象,我可以清除列表,是否可以删除我插槽中的列表本身?
is it possible to delete the list itsef in my slot?
不,这不可能。因为您的插槽按值接受列表,它是原始 QList<MyClass *> *list
对象的副本。
void OtherClass::slotList(QList<MyClass> list)
为了能够删除 list
对象,您应该更改 slotList
参数以接受指向 list
.
的指针
不,这是不可能的,因为 list
不是(相同的)指针,也不是对 *list
的引用(在这种情况下你可以 delete &list;
(是的,一个肮脏的黑客) - 仅在直接连接的情况下)并改为按值传递。
为什么首先要动态分配列表?
不是你写的那样。 list
参数是按值传递的,因此它是指针 list
指向的列表的 copy (如果您给两个变量不同的名称)。
即使您将 slotList
更改为通过引用获取其参数 (slotList(QList<MyClass> &list)
),将 delete &list
放入其中仍然不是一个好主意。那是因为在 Qt 中,一些信号槽连接(例如排队连接或跨线程连接)不直接对信号的参数进行操作,而是对它们的副本进行操作。
如果出于某种原因,您需要将列表的所有权从创建者信号传播到插槽并在那里删除它,您必须更改插槽以接受指针:
QList<MyClass *> *row = new QList<MyClass *>();
...
emit listReady(row);
void OtherClass::slotList(QList<MyClass> *list) {
...
delete list;
}
然而,最重要的问题是:为什么您首先要动态分配 QList
?容器(如 QList
)很少需要动态分配。这对于通过隐式共享和写时复制实现的 Qt 容器来说更是如此,因此即使复制 QList
也很便宜(它不会复制其内容)。因此,适合您的正确解决方案很可能是 row
是对象而不是指针,而忘记整个 new
/delete
业务。
我有一些遗留代码,其中对象是动态分配然后发出的:
QList<MyClass *> *list = new QList<MyClass *>();
...
emit listReady(*row);
void OtherClass::slotList(QList<MyClass> list) {
...
delete list???
}
我可以删除列表中的对象,我可以清除列表,是否可以删除我插槽中的列表本身?
is it possible to delete the list itsef in my slot?
不,这不可能。因为您的插槽按值接受列表,它是原始 QList<MyClass *> *list
对象的副本。
void OtherClass::slotList(QList<MyClass> list)
为了能够删除 list
对象,您应该更改 slotList
参数以接受指向 list
.
不,这是不可能的,因为 list
不是(相同的)指针,也不是对 *list
的引用(在这种情况下你可以 delete &list;
(是的,一个肮脏的黑客) - 仅在直接连接的情况下)并改为按值传递。
为什么首先要动态分配列表?
不是你写的那样。 list
参数是按值传递的,因此它是指针 list
指向的列表的 copy (如果您给两个变量不同的名称)。
即使您将 slotList
更改为通过引用获取其参数 (slotList(QList<MyClass> &list)
),将 delete &list
放入其中仍然不是一个好主意。那是因为在 Qt 中,一些信号槽连接(例如排队连接或跨线程连接)不直接对信号的参数进行操作,而是对它们的副本进行操作。
如果出于某种原因,您需要将列表的所有权从创建者信号传播到插槽并在那里删除它,您必须更改插槽以接受指针:
QList<MyClass *> *row = new QList<MyClass *>();
...
emit listReady(row);
void OtherClass::slotList(QList<MyClass> *list) {
...
delete list;
}
然而,最重要的问题是:为什么您首先要动态分配 QList
?容器(如 QList
)很少需要动态分配。这对于通过隐式共享和写时复制实现的 Qt 容器来说更是如此,因此即使复制 QList
也很便宜(它不会复制其内容)。因此,适合您的正确解决方案很可能是 row
是对象而不是指针,而忘记整个 new
/delete
业务。