從我Note
類對象創建的對象是通過保持一個指針列表存儲在名爲m_noteList
:刪除與「新」
QSharedPointer<Note> note(new Note(this));
m_noteList << note;
:
QList< QSharedPointer<Note> > m_noteList;
我通過創建一個類的對象
刪除的推移(獲得正確的指數idx
後物色對象):
delete m_noteList[idx].data();
在QtCreator(調試模式)
HEAP[MyApp.exe]:
HEAP: Free Heap block 024FC240 modified at 02500330 after it was freed
而且dissambler
錯誤消息:
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
信號停止的過程(分段故障)
所以,我真的不知道我做錯了,以及如何避開它
我的解決方案是非常髒:設定某種的deleted
的-tag到我的對象,但我需要在所有其他功能來檢查這個忽略的對象......
編輯:
我意識到一兩件事:如果我刪除一個音符(與removeAt()
),它是刪除(我通過觀看控制檯打印輸出看到它),但它的GUI不會消失。然後,如果我再次單擊該對象的特定按鈕以刪除該註釋,則應用程序會崩潰(因爲它不再存在,但只有gui)。但是如果我之前寫這個deleteLater
,在刪除它之後,gui也會消失,一切看起來都很好。 有人可以解釋一下,爲什麼?
m_noteList.at(idx)->deleteLater();
m_noteList.removeAt(idx);
你不應該'刪除'QSharedPointer管理的資源。 – juanchopanza
那麼我應該如何刪除它,或者我可以創建一個'QList'沒有'QSharedPointer'?不知道我是否真的需要它。 –
user2366975
一旦沒有處理相同資源的共享指針,刪除就會自動發生。這是共享指針的一點(沒有雙關語意思)。 – juanchopanza