是否可以删除解除引用的指针

时间:2017-08-15 07:31:05

标签: c++ qt pointers delete-operator

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

QList<MyClass *> *list = new QList<MyClass *>();
...
emit listReady(*row);

void OtherClass::slotList(QList<MyClass> list) {
    ...
    delete list???
}

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

3 个答案:

答案 0 :(得分:5)

  

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

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

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

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

答案 1 :(得分:1)

不是你写的方式。 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业务。

答案 2 :(得分:0)

不,这是不可能的,因为list不是(相同的)指针,也不是*list的引用(在这种情况下你可以delete &list;(是的,一个脏的) hack) - 仅在直接连接的情况下)并且通过值传递。

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