是否可以删除取消引用的指针

Is it possible to delete a dereferenced Pointer

本文关键字:引用 指针 取消 删除 是否      更新时间:2023-10-16

我有一些遗留代码,其中动态分配对象然后发出:

QList<MyClass *> *list = new QList<MyClass *>();
...
emit listReady(*row);
void OtherClass::slotList(QList<MyClass> list) {
...
delete list???
}

我可以删除列表中的对象,也可以清除列表,是否可以删除插槽中的列表?

是否可以删除我的插槽中的列表?

不,这是不可能的。因为您的插槽接受按值列出的列表,这是原始QList<MyClass *> *list对象的副本。

void OtherClass::slotList(QList<MyClass> list)

为了能够删除list对象,您应该更改slotList参数以接受指向list的指针。

不是你写的。list参数是按值传递的,因此它是指针list指向的列表的副本(如果您为两个变量指定不同的名称,则可能有助于澄清您的问题(。

即使您更改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业务。

不,这是不可能的,因为list不是(相同的(指针,也不是对*list的引用(在这种情况下,您可以delete &list;(是的,一个肮脏的黑客( - 仅在直接连接的情况下(而是按值传递。

为什么要首先动态分配列表?