2017-08-15 58 views
0

我在那裏的目的是動態分配的,然後發出一些舊代碼:是否可以刪除取消引用指針

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

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

我可以在列表中刪除對象,我可以明確的名單,是它有可能刪除我的插槽itsef列表?

+1

應該將第一個'list'(指針)實際上命名爲'row',以便以後匹配它的用法嗎? – Angew

回答

5

是否可以刪除我的槽中的itsef列表?

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

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

爲了能夠刪除list對象,你應該改變slotList參數接受指針list

+0

好的意思是我可以刪除我的列表後發射它,因爲慢會得到一個副本? – wutzebaer

+0

@wutzebaer在這個特殊情況下 - 是的。但在另一種情況下,當列表將按值包含對象時,刪除此列表將會產生額外開銷(將對象複製到新列表中,將它們從舊列表中刪除),並且通過指針將列表傳遞到插槽中更容易。 – ikleschenkov

+0

@ikleschenkov Qt容器與寫時複製隱式共享。複製列表並不會自動複製其所有元素。 – Angew

0

不,這是不可能的,因爲list不是(下同)的指針,也不參考*list(在這種情況下,你可以delete &list;(是的,一個骯髒的黑客) - 只有在直接連接的情況下),並且是按值傳遞代替。

爲什麼你首先動態分配列表?

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作爲對象而不是指針,並且忘記了整個業務。

相關問題