看板 C_and_CPP 關於我們 聯絡資訊
from: http://stackoverflow.com/questions/13521029/qt-memory-management 1: QPushButton *p_button = new QPushButton(this); 2: QPushButton my_button(this); 在 QWidget 產生 p_button, my_button, p_button 沒問題, QWidget dtor 會負責 delete 它 (當然得先要記住它才行), 那 my_button 怎麼辦? 有辦法分辨某個指標的位址是 new 來的, 還是 stack 分配出來的嗎? 我印象中 qt 建議使用 new 來產生 object, 應該是這個關係, 但是我不確定。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.125.239.51
Feis:my_button 會在 scope 結束時解構~ 09/14 15:38
Feis:如同一般變數. 09/14 15:39
Feis:QObject 設計上應該是用 new 的, 然後把指標作為某 QObject 09/14 15:43
Feis:的 child, 當 parent 死掉時, 會把所有 child 殺光. 09/14 15:44
Feis:至於分辨 heap 或 stack, 因為純就位址來說還要看 OS. 09/14 15:53
Feis:我覺得從C/C++語言層次不太能做什麼. 可能要迴避他. 09/14 15:54
Feis:另一種就是自己實作指標類別, 但是要大改. 應該不是你要的. 09/14 15:57
Feis:簡單的想法是所有 QObject 都要 new, 都要認 parent 即可. 09/14 15:58
Feis:QObject 們會構成樹. 你 delete 其中一個會自動把下面都清光 09/14 16:07
Feis:不用new的情況是沒parent,例如QApplication 09/14 16:46
uranusjr:不用 new 代表你希望該 object 出 scope 自爆, 和有沒有 09/14 17:05
uranusjr:parent 無關; 事實上 QApplication 完全可以用 new... 09/14 17:05
Feis:不是說不能用. 而我指的是通常你沒有 parent 就是不會出scope 09/14 17:06
Feis:只是說一個我覺得可以用的慣用法而已. 沒其他意思~ 09/14 17:07
Feis:要不要 new 當然是看 scope 跟你要的 lifetime. 09/14 17:09
Feis:不過有 parent 然後不用 new 的例子, 我覺得蠻有趣的. 我想想 09/14 17:16
Feis:看.. 感覺不太直觀 @_@ 09/14 17:16
Feis:我好像想不到, 感覺風險很大. Q_Q 09/14 17:24
Feis:我的規則應該是: 有 parent 就 new, 不 new 的一定沒 parent 09/14 17:31
Feis:不過就參考用~ @_@ 09/14 17:31
uranusjr:不是在 main 裡面建構的 top-level widget 就不能有 09/14 17:37
uranusjr:parent 啊, 例如如果你需要動態產生 app-level 的 dialog 09/14 17:38
uranusjr:就會用到了啊... 09/14 17:39
Feis:對阿. 我的意思應該是 root 可能可以選擇要不要 new 09/14 17:41
Feis:但是其他的應該不能選, 一定要 new ? 這樣對嗎? 09/14 17:41
Feis:"通常你沒有 parent 就是不會出scope" 這句是表達錯誤 09/14 17:44