我有C本類對象++(使用Qt):C++刪除指針列表
class Foo {
public:
Foo();
~Foo();
QList<Bar*> barList;
}
我的問題是:我是否需要刪除barList每個Bar對象的析構函數(for循環),還是因爲列表是一個靜態對象,所有的東西都會被Foo對象刪除?
謝謝。
我有C本類對象++(使用Qt):C++刪除指針列表
class Foo {
public:
Foo();
~Foo();
QList<Bar*> barList;
}
我的問題是:我是否需要刪除barList每個Bar對象的析構函數(for循環),還是因爲列表是一個靜態對象,所有的東西都會被Foo對象刪除?
謝謝。
您可以使用qDeleteAll(...)
(基本上,您的列表上有一個foreach
,並在每個物品上調用delete
)。做不是使用QList::clear()
它只是從列表中刪除項目,但不會觸發解除分配。但是,您可以將兩者結合起來,首先釋放列表項目(指針)所引用對象的內存,然後使用clear()
從列表中刪除項目(指針),留下空的barList
。
除此之外,如果Bar
從QObject
派生,您可以將其父項設置爲另一個對象/小部件,您肯定會在某個點正確釋放它。這是Qt中的父子模型,並且是一種清理東西的好方法,無需親自處理刪除操作。
另外static
這是不正確的。我認爲你的意思是on the stack
即你的barList
不是動態分配的。
一個忠告:即使你有Bar*
這並沒有意味着項目本身是動態分配的。您可以在堆棧上創建項目,然後通過引用至少添加它們,如果嘗試刪除它們,則會導致分段錯誤。既然你不提供更多的代碼,我不能說你的Bar*
是否是動態分配的。
當然,這取決於Bar
代表什麼,所以第二個建議可能不適用於給定的場景。
順便說一下,你的問題顯示一般缺乏理解指針如何工作,實際上不是Qt相關(即使你的問題是在Qt的上下文中)。我的建議是查找一些關於C/C++指針的一般信息,然後轉到Qt提供的容器上。
感謝您的回答!我一定會找到關於指針的更多信息,我已經使用了很多PyQt,並且這些都在表單下發生。 –
Bar類是一個Coordinate對象,它在堆棧上只有兩個int,並且我正在動態分配它們,再次感謝。 –
雖然你可以使用PyQt而沒有做任何C++ Qt代碼,但我會建議你不要走這條路。雖然PyQt非常好(畢竟是Python:P),但PyQt只是一個包裝,所以仍然存在C++代碼。你的Python代碼可能看起來不錯,但是你突然發現了一個分段錯誤......爲什麼?因爲底下的C++代碼破裂了。:P也有一些在PyQt中不可用的東西,例如完全基於模板的併發模塊,並且不可能在Python中創建包裝器。所以是的,這兩個都值得學習。 :) – rbaleksandar
當'barlist'被破壞時,'Bar *'指向的資源可能不會被清理。 – Charles
_「或自列表是靜態對象」_什麼讓你這麼想? –
通過靜態我的意思是列表沒有被實例化使用'new',糾正我,如果我錯了,但對象中的非指針變量總是銷燬對象的權利? –