我有一个充满动态创建的对象的Qlist。在终止我的程序之前,我打电话myqlist.clear()需要释放QList内容吗?
我的问题是:这是否也删除(免费)列表中包含的对象? Valgrind给我一些丢失的块,我想知道我是否误解了qlist清除方法的工作原理。
或者,我是否需要遍历qlist并删除每个对象?
更新:我可以证实,mylist.erase(迭代器)从列表中删除的项目,而不是释放动态分配的对象。 (该对象是一个动态实例化的类)。很奇怪!我从Qlist切换到QLinkedList,但结果相同。请记住,我的QLinkedList是QLinkedList < MyClass的>不是QLinkedList < * MyClass的>
下面是情况下,实际的代码有人能找到我做错了什么:
// Here I define a couple important items. Note that AMISendMessageFormat is a class
typedef QLinkedList<AMISendMessageFormat> TSentMessageQueue;
TSentMessageQueue m_sentMessageQueue;
// Here I create the message and append to my QLinkedList
AMISendMessageFormat *newMessage = new AMISendMessageFormat(messageToSend);
m_sentMessageQueue.append(*newMessage);
// Here I delete
for (TSentMessageQueue::Iterator sMessagePtr = m_sentMessageQueue.begin(); sMessagePtr != m_sentMessageQueue.end();)
{
sMessagePtr = m_sentMessageQueue.erase(sMessagePtr);
qDebug() << "Sent size after erase: " << m_sentMessageQueue.size(); // Confirmed linked list is shrinking in size
}
并通过列表迭代后并擦除,valgrind显示每个AMISendMessageFormat对象都是丢失的块!
我怀疑这与用迭代器在循环内擦除有关......但我无法理解这一点!
见下文......问题的详细解决方案是,附加功能,使副本,并将其添加到列表中...我虽然它加入实际对象(不是副本)......所以,问题是'新'副本被泄露。
更好的成语可能会存储智能指针,而不是在你的'QList'原始指针,所以你不必与明确地应对。它也使得拥有这些对象的人变得更加明确。 – ereOn
@ereOn这是一个很好的建议,但并不适用于Qt。 – pmr
@pmr:在[docs](http://qt-project.org/doc/qt-4.8/qlist.html)内没有任何地方声明'QList'拥有指针的所有权,我相信Qt拥有'QSharedPointer '所以我不确定这不适用。我在这里错过了什么吗? – ereOn