2016-11-21 101 views
-1

我有C本類對象++(使用Qt):C++刪除指針列表

class Foo { 

    public: 
     Foo(); 
     ~Foo(); 

     QList<Bar*> barList; 
} 

我的問題是:我是否需要刪除barList每個Bar對象的析構函數(for循環),還是因爲列表是一個靜態對象,所有的東西都會被Foo對象刪除?

謝謝。

+0

當'barlist'被破壞時,'Bar *'指向的資源可能不會被清理。 – Charles

+2

_「或自列表是靜態對象」_什麼讓你這麼想? –

+0

通過靜態我的意思是列表沒有被實例化使用'new',糾正我,如果我錯了,但對象中的非指針變量總是銷燬對象的權利? –

回答

2

您可以使用qDeleteAll(...)(基本上,您的列表上有一個foreach,並在每個物品上調用delete)。做不是使用QList::clear()它只是從列表中刪除項目,但不會觸發解除分配。但是,您可以將兩者結合起來,首先釋放列表項目(指針)所引用對象的內存,然後使用clear()從列表中刪除項目(指針),留下空的barList

除此之外,如果BarQObject派生,您可以將其父項設置爲另一個對象/小部件,您肯定會在某個點正確釋放它。這是Qt中的父子模型,並且是一種清理東西的好方法,無需親自處理刪除操作。

另外static這是不正確的。我認爲你的意思是on the stack即你的barList不是動態分配的。

一個忠告:即使你有Bar*這並沒有意味着項目本身是動態分配的。您可以在堆棧上創建項目,然後通過引用至少添加它們,如果嘗試刪除它們,則會導致分段錯誤。既然你不提供更多的代碼,我不能說你的Bar*是否是動態分配的。

當然,這取決於Bar代表什麼,所以第二個建議可能不適用於給定的場景。

順便說一下,你的問題顯示一般缺乏理解指針如何工作,實際上不是Qt相關(即使你的問題是在Qt的上下文中)。我的建議是查找一些關於C/C++指針的一般信息,然後轉到Qt提供的容器上。

+0

感謝您的回答!我一定會找到關於指針的更多信息,我已經使用了很多PyQt,並且這些都在表單下發生。 –

+0

Bar類是一個Coordinate對象,它在堆棧上只有兩個int,並且我正在動態分配它們,再次感謝。 –

+0

雖然你可以使用PyQt而沒有做任何C++ Qt代碼,但我會建議你不要走這條路。雖然PyQt非常好(畢竟是Python:P),但PyQt只是一個包裝,所以仍然存在C++代碼。你的Python代碼可能看起來不錯,但是你突然發現了一個分段錯誤......爲什麼?因爲底下的C++代碼破裂了。:P也有一些在PyQt中不可用的東西,例如完全基於模板的併發模塊,並且不可能在Python中創建包裝器。所以是的,這兩個都值得學習。 :) – rbaleksandar