qt的記憶體管理,誰偷偷delete了我的子物件?

2021-10-04 05:04:01 字數 680 閱讀 1227

qt的記憶體管理解決了乙個問題,就是new乙個新物件時不一定要delete,因為如果它有自己的父物件,在父物件刪除時會自動刪除子物件。

這個又帶來乙個新問題,別弄錯爹。

昨天專案一直在關掉mainwindow後報錯,說有野指標,我發現問題出在乙個析構函式上。

communicationtest::~communicationtest()

其中m_progress是communicationtest類的乙個區域性指標,問題就在這句delete m_progress;裡,我發現此時m_progress指向的位址是未知的。

也就是說有人在我delete它之前偷偷delete過了,我就很疑惑誰偷偷delete了我的物件?

然後我發現一件事,在communicaitontest的建構函式裡我寫了這麼一句

...

m_progress=new cprogress;

m_progress->setparent(mainwid);//mainwid是乙個指向mainwindow的指標

...

真相大白,它爹給它已經刪了。

當我關閉整個視窗的時候mainwindow已經釋放了m_progress,我再在析構函式裡delete,肯定要出問題。

所以指定了父物件之後請不要再使用delete了!

Qt的記憶體管理

在qt的程式中經常會看到只有new而不delete的情況,其實是因為qt有一套 記憶體的機制,主要的規則如下 1.所有繼承自qobject類的類,如果在new的時候指定了父親,那麼它的清理時在父親被delete的時候delete的,所以如果乙個程式中,所有的qobject類都指定了父親,那麼他們是會...

QT記憶體管理

使用new操作符來定義乙個物件 qvboxlayout layout new qvboxlayout window 另外一種方法 qvboxlayout layout window c 並沒有提供記憶體自動管理機制,通常,需要程式開發人員自己去做這些事情,比如在建構函式中使用了new去申請了乙個物件...

六 Qt記憶體管理

父子關係 所有指定了父物件的qt物件 繼承自qobject類的例項 與其父物件間存在父子關係 每個qt物件都儲存有指向其所有子物件的指標 每個qt物件都有乙個指向其父物件的指標 當指定 通過建構函式指定,或通過setparent函式 qt物件的父物件時 其父物件會在子物件鍊錶中加入指向該物件的指標 ...