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

C++ 是否可以删除取消引用的指针,c++,qt,pointers,delete-operator,C++,Qt,Pointers,Delete Operator,我有一些遗留代码,其中动态分配对象,然后发出: QList<MyClass *> *list = new QList<MyClass *>(); ... emit listReady(*row); void OtherClass::slotList(QList<MyClass> list) { ... delete list??? } QList*list=new QList(); ... 发出listReady(*行); void Oth

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

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

void OtherClass::slotList(QList<MyClass> list) {
    ...
    delete list???
}
QList*list=new QList();
...
发出listReady(*行);
void OtherClass::slotList(QList列表){
...
删除列表???
}
我可以删除列表中的对象并清除列表,是否可以删除插槽中的列表itsef

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

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

void OtherClass::slotList(QList列表)

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

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

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

void OtherClass::slotList(QList列表)


要能够删除
列表
对象,您应该更改
slotList
参数以接受指向
列表
的指针。不,这是不可能的,因为
列表
不是(相同的)指针,也不是对
*列表
的引用(在这种情况下,您可以
删除&list;
(是的,肮脏的黑客)-仅在直接连接的情况下)并通过值传递


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

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


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

不是以您编写列表的方式<代码>列表参数是按值传递的,因此它是指针
列表
指向的列表的副本(如果为两个变量指定不同的名称,可能有助于澄清问题)

即使您将
slotList
更改为通过引用获取其参数(
slotList(QList&list)
),在内部
delete&list
仍然不是一个好主意。这是因为,某些信号插槽连接(例如排队连接或跨线程的连接)并不直接对信号的参数进行操作,而是对其副本进行操作

如果出于某种原因,您需要将列表的所有权从创建者信号传播到插槽并将其删除,则必须更改插槽以接受指针:

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

void OtherClass::slotList(QList<MyClass> *list) {
    ...
    delete list;
}
QList*行=新的QList();
...
发射列表就绪(行);
void OtherClass::slotList(QList*list){
...
删除名单;
}

然而,最重要的问题是:为什么您首先要动态地分配
QList
?容器(如
QList
)很少需要动态分配。对于使用隐式共享和写时复制实现的Qt容器来说,这一点更为重要,因此即使复制
QList
也很便宜(它不会复制其内容)。因此,正确的解决方案很可能是将
作为对象而不是指针,并忘记整个
新建
/
删除
业务。

而不是以您编写的方式<代码>列表参数是按值传递的,因此它是指针
列表
指向的列表的副本(如果为两个变量指定不同的名称,可能有助于澄清问题)

即使您将
slotList
更改为通过引用获取其参数(
slotList(QList&list)
),在内部
delete&list
仍然不是一个好主意。这是因为,某些信号插槽连接(例如排队连接或跨线程的连接)并不直接对信号的参数进行操作,而是对其副本进行操作

如果出于某种原因,您需要将列表的所有权从创建者信号传播到插槽并将其删除,则必须更改插槽以接受指针:

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

void OtherClass::slotList(QList<MyClass> *list) {
    ...
    delete list;
}
QList*行=新的QList();
...
发射列表就绪(行);
void OtherClass::slotList(QList*list){
...
删除名单;
}

然而,最重要的问题是:为什么您首先要动态地分配
QList
?容器(如
QList
)很少需要动态分配。对于使用隐式共享和写时复制实现的Qt容器来说,这一点更为重要,因此即使复制
QList
也很便宜(它不会复制其内容)。因此,正确的解决方案很可能是将
作为对象而不是指针,并忘记整个
新建
/
删除
业务。

确定意味着我可以在发出列表后删除列表,因为在这种特殊情况下,慢速者将获得副本???@wutzebaer-是的。但在另一种情况下,当列表将按值包含对象时,删除此列表将产生额外的开销(将对象复制到新列表,从旧列表中删除它们),并且更容易通过指针将列表传递到插槽中。@ikleschenkov Qt容器在写入时与copy隐式共享。复制列表不会自动复制其所有元素。确定意味着我可以在发出列表后删除列表,因为在这种特殊情况下,慢速将获得副本???@wutzebaer-是。但在另一种情况下,当列表将按值包含对象时,删除此列表将产生额外的开销(将对象复制到新列表,从旧列表中删除它们),并且更容易通过指针将列表传递到插槽中。@ikleschenkov Qt容器在写入时与copy隐式共享。复制列表不会自动复制其所有元素。第一个
列表
(指针)是否应实际命名为
,以匹配其以后的用法?第一个
列表
(指针)是否应