【发布时间】:2014-03-30 21:15:30
【问题描述】:
我的类 Note 中的对象通过将指针保存在名为 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 信号停止了进程(分段错误)
所以我真的不知道我做错了什么以及如何解决它
我的解决方案很脏:为我的对象设置某种deleted-tag,但我需要在所有其他函数中检查它以忽略该对象...
编辑:
我意识到一件事:如果我删除一个注释(使用removeAt()),它会被删除(我通过查看控制台打印输出看到它),但它的 gui 并没有消失。然后,如果我再次单击该对象的删除注释的特定按钮,应用程序将崩溃(因为它不再真正存在,而只有 gui)。但是如果我之前写过这个deleteLater,在删除它之后,gui 也会消失,一切看起来都很好。
谁能解释一下,为什么?
m_noteList.at(idx)->deleteLater();
m_noteList.removeAt(idx);
【问题讨论】:
-
你不应该
deleteQSharedPointer管理的资源。 -
那么我应该如何删除它,或者我可以创建一个没有
QSharedPointer的QList<Note>?不确定我是否真的需要它。 -
一旦没有共享指针处理相同的资源,删除就会自动发生。这就是共享指针的意义(不是双关语)。
-
然后,只要共享指针超出范围,它就会被删除。但是共享指针用于共享所有权。如果您没有共享所有权,则不需要共享指针。
-
@juanchopanza 这并不完全正确,因为您不能真正将
QScopedPointer或std::unique_ptr放入Qt 容器或实际上任何容器中。只有支持emplace_back的 C++11 容器才支持此功能。对于在容器中存储指针,QSharedPointer是唯一的解决方案。
标签: c++ qt pointers segmentation-fault