[英]Deleting an object created with “new”
我的類Note
中的對象通過將指針保存在名為m_noteList
的列表中來m_noteList
:
QList< QSharedPointer<Note> > m_noteList;
我通過以下方式創建該類的對象:
QSharedPointer<Note> note(new Note(this));
m_noteList << note;
刪除經過(在獲得正確的索引idx
以識別對象之后):
delete m_noteList[idx].data();
QtCreator中的錯誤消息(調試模式)
HEAP[MyApp.exe]:
HEAP: Free Heap block 024FC240 modified at 02500330 after it was freed
和消息:
0x777349ab <+0x0000> cmpb $0x0,0x2(%eax)
0x777349af <+0x0000> je 0x777349c6
0x777349b1 <+0x0000> movb $0x1,0x7774d640
0x777349b8 <+0x0000> mov %ecx,0x7774d644
0x777349be <+0x0000> int3
0x777349bf <+0x0000> movb $0x0,0x7774d640 //<-- Here is a stop mark
0x777349c6 <+0x0000> ret
0x777349c7 <+0x0000> nop
...
我也試過這個:
m_noteList.removeAt(idx);
哪個也行不通。 操作系統發出的SIGSEGV
信號停止了進程(Segmentation fault)
所以我真的不知道我做錯了什么以及如何解決它
我的解決方案非常臟:為我的對象設置一些deleted
-tag,但是我需要在其他所有函數中檢查它以忽略該對象...
編輯:
我意識到一件事:如果我刪除一個音符(使用removeAt()
),它將被刪除(我通過觀看控制台打印輸出看到它),但它的gui不會消失。 然后,如果我再次單擊該對象的特定按鈕以刪除該注釋,則應用程序崩潰(因為它不再存在,只有gui)。 但是如果我之前寫了這個deleteLater
,在刪除它之后,gui也會消失,一切似乎deleteLater
。 有人可以解釋一下,為什么?
m_noteList.at(idx)->deleteLater();
m_noteList.removeAt(idx);
您正在混合三種內存管理策略:
QObject
父子內存管理:當刪除父QObject
時,它會自動刪除所有子QObjects
。 這里解釋一下 。 刪除對象是自動完成的,因此不需要顯式刪除。
QSharedPointer
內存管理:當刪除引用對象的最后一個QSharedPointer
時,該對象將被刪除。 這里解釋一下 。 該對象會自動刪除,因此不需要顯式刪除。
“手動”內存管理: new
一個對象並在合適的時間delete
一個對象。 在C ++標准中解釋。 必須手動刪除該對象。
您應該只選擇上述之一,以確保不要雙重刪除對象。 我建議在#1和#2之間進行選擇,具體取決於您打算如何使用這些對象。 如果您打算在“父母”之間共享對象,請使用#2,否則使用#1。
給定QList<QSharedPointer<Note>> m_noteList
:
刪除Note
對象是由m_noteList.removeAt(idx)
完成的,假設沒有其他現存的指針副本。 你只需要破壞給定音符的最后一個共享指針,就是這樣。 在共享指針的數據上調用delete
始終是一個錯誤 。
我無法使用removeAt
重現您的問題 - 只有在您首先delete
Note時才會發生這種情況,這是您不應該做的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.