Поведение деструктора 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 удалить pointees.

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

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

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]