у меня есть 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()
?
Для уточнения: уничтожение QList уничтожит элементы списка. Если элементы являются указателями, уничтожаются сами указатели, а не указатели. Ты можешь использовать qDeleteAll
удалить pointees.
(Это будет использовать operator delete
, который является правильным выбором, если и только если вы используете operator new
; malloc
всегда будет требовать free
а также operator new[]
всегда будет требовать operator delete[]
).
Сказанное выше, возврат QList по значению не уничтожит его, так как его refcount не упадет до 0. Получение сбоя означает, что очень вероятно, что у вас есть некоторое повреждение памяти. Используйте valgrind или аналогичные инструменты для его устранения.
Других решений пока нет …