簡體   English   中英

刪除使用“new”創建的對象

[英]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);

您正在混合三種內存管理策略:

  1. QObject父子內存管理:當刪除父QObject時,它會自動刪除所有子QObjects 這里解釋一下 刪除對象是自動完成的,因此不需要顯式刪除。

  2. QSharedPointer內存管理:當刪除引用對象的最后一個QSharedPointer時,該對象將被刪除。 這里解釋一下 該對象會自動刪除,因此不需要顯式刪除。

  3. “手動”內存管理: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM