Поведение деструктора QList - вызывает ли delete/free() указатели в списке?

У меня есть 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()?

1 ответ

Решение

Для уточнения: уничтожение QList уничтожит элементы списка. Если элементы являются указателями, уничтожаются сами указатели, а не указатели. Ты можешь использовать qDeleteAll удалить пуанты.

(Это будет использовать operator delete, который является правильным выбором, если и только если вы используете operator new; malloc всегда будет требовать free а также operator new[] всегда будет требовать operator delete[]).

Сказанное выше, возвращение QList по значению не уничтожит его, так как его refcount не упадет до 0. Получение сбоя означает, что очень вероятно, что у вас есть некоторое повреждение памяти. Используйте valgrind или аналогичные инструменты для его устранения.

Другие вопросы по тегам