[問題] Qt: QPushButton 物件的回收該如何做

看板C_and_CPP (C/C++)作者 (「雄辯是銀,沉默是金」)時間12年前 (2013/09/14 14:44), 編輯推噓0(0026)
留言26則, 2人參與, 最新討論串1/1
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

09/14 15:38, , 1F
my_button 會在 scope 結束時解構~
09/14 15:38, 1F

09/14 15:39, , 2F
如同一般變數.
09/14 15:39, 2F

09/14 15:43, , 3F
QObject 設計上應該是用 new 的, 然後把指標作為某 QObject
09/14 15:43, 3F

09/14 15:44, , 4F
的 child, 當 parent 死掉時, 會把所有 child 殺光.
09/14 15:44, 4F

09/14 15:53, , 5F
至於分辨 heap 或 stack, 因為純就位址來說還要看 OS.
09/14 15:53, 5F

09/14 15:54, , 6F
我覺得從C/C++語言層次不太能做什麼. 可能要迴避他.
09/14 15:54, 6F

09/14 15:57, , 7F
另一種就是自己實作指標類別, 但是要大改. 應該不是你要的.
09/14 15:57, 7F

09/14 15:58, , 8F
簡單的想法是所有 QObject 都要 new, 都要認 parent 即可.
09/14 15:58, 8F

09/14 16:07, , 9F
QObject 們會構成樹. 你 delete 其中一個會自動把下面都清光
09/14 16:07, 9F

09/14 16:46, , 10F
不用new的情況是沒parent,例如QApplication
09/14 16:46, 10F

09/14 17:05, , 11F
不用 new 代表你希望該 object 出 scope 自爆, 和有沒有
09/14 17:05, 11F

09/14 17:05, , 12F
parent 無關; 事實上 QApplication 完全可以用 new...
09/14 17:05, 12F

09/14 17:06, , 13F
不是說不能用. 而我指的是通常你沒有 parent 就是不會出scope
09/14 17:06, 13F

09/14 17:07, , 14F
只是說一個我覺得可以用的慣用法而已. 沒其他意思~
09/14 17:07, 14F

09/14 17:09, , 15F
要不要 new 當然是看 scope 跟你要的 lifetime.
09/14 17:09, 15F

09/14 17:16, , 16F
不過有 parent 然後不用 new 的例子, 我覺得蠻有趣的. 我想想
09/14 17:16, 16F

09/14 17:16, , 17F
看.. 感覺不太直觀 @_@
09/14 17:16, 17F

09/14 17:24, , 18F
我好像想不到, 感覺風險很大. Q_Q
09/14 17:24, 18F

09/14 17:31, , 19F
我的規則應該是: 有 parent 就 new, 不 new 的一定沒 parent
09/14 17:31, 19F

09/14 17:31, , 20F
不過就參考用~ @_@
09/14 17:31, 20F

09/14 17:37, , 21F
不是在 main 裡面建構的 top-level widget 就不能有
09/14 17:37, 21F

09/14 17:38, , 22F
parent 啊, 例如如果你需要動態產生 app-level 的 dialog
09/14 17:38, 22F

09/14 17:39, , 23F
就會用到了啊...
09/14 17:39, 23F

09/14 17:41, , 24F
對阿. 我的意思應該是 root 可能可以選擇要不要 new
09/14 17:41, 24F

09/14 17:41, , 25F
但是其他的應該不能選, 一定要 new ? 這樣對嗎?
09/14 17:41, 25F

09/14 17:44, , 26F
"通常你沒有 parent 就是不會出scope" 這句是表達錯誤
09/14 17:44, 26F
文章代碼(AID): #1ID0MrbE (C_and_CPP)
文章代碼(AID): #1ID0MrbE (C_and_CPP)