繁体   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