1

我有一个class SomeObjectList : public QList<SomeObject*>

我正在创建指向SomeObject并将它们粘贴在列表中的指针,如下所示:

SomeObjectList MyClass::getSomeObjects()
{
    SomeObjectList list;

    for( int i=0; i<10; ++i )
    {
        list << new SomeObject();
    }

    return list;   // Crashes approximately here in QList::~QList
}

我在QList析构函数中崩溃了,看起来 free() 可能被调用了。我找到了函数的源代码(Qt 4.8.2),它看起来像这样:

template <typename T>
Q_OUTOFLINE_TEMPLATE QList<T>::~QList()
{
    if (!d->ref.deref())
        free(d);
}

这是否意味着free()在调用析构函数时正在对列表中剩余的任何指针进行调用?我在其他地方使用过列表没有这个问题。析构函数在什么情况下调用free()

4

1 回答 1

7

详细说明:销毁 QList 将销毁列表的元素。如果元素是指针,则指针本身被销毁,而不是指针。您可以使用qDeleteAll删除指针

(这将使用operator delete,当且仅当您使用operator new;malloc将始终需要free并且operator new[]将始终需要时,这是正确的选择operator delete[])。

话虽如此,按值返回 QList 不会破坏它,因为它的引用计数不会下降到 0。在那里发生崩溃意味着你很可能有一些内存损坏。使用 valgrind 或类似工具进行调试。

于 2013-06-27T17:07:16.537 回答