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隐式共享。复制列表不会自动复制其所有元素。第一个列表
(指针)是否应实际命名为行
,以匹配其以后的用法?第一个列表
(指针)是否应