C++ QList析构函数行为-是否对列表中的指针调用delete/free()?

C++ QList析构函数行为-是否对列表中的指针调用delete/free()?,c++,qt,qt4,destructor,qlist,C++,Qt,Qt4,Destructor,Qlist,我有一个类SomeObjectList:publicqlist 我正在创建指向SomeObject的指针,并将其粘贴在列表中,如下所示: SomeObjectList MyClass::getSomeObjects() { SomeObjectList list; for( int i=0; i<10; ++i ) { list << new SomeObject(); } return list; // Cras

我有一个
类SomeObjectList:publicqlist

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

SomeObjectList MyClass::getSomeObjects()
{
    SomeObjectList list;

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

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

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

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

(这将使用
operator delete
,当且仅当您使用
operator new
时,这是正确的选择;
malloc
将始终要求
免费
operator new[]
将始终要求
operator delete[]


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

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

(这将使用
operator delete
,当且仅当您使用
operator new
时,这是正确的选择;
malloc
将始终要求
免费
operator new[]
将始终要求
operator delete[]


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

您也可以将列表定义为
QList
,不必处理删除;)不,你不能。QScopedPointer不可复制。您还可以将列表定义为
QList
,并且不必处理删除;)不,你不能。QScopedPointer不可复制。
template <typename T>
Q_OUTOFLINE_TEMPLATE QList<T>::~QList()
{
    if (!d->ref.deref())
        free(d);
}