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);
}