2016-11-21 122 views
-1

我有C本类对象++(使用Qt):C++删除指针列表

class Foo { 

    public: 
     Foo(); 
     ~Foo(); 

     QList<Bar*> barList; 
} 

我的问题是:我是否需要删除barList每个Bar对象的析构函数(for循环),还是因为列表是一个静态对象,所有的东西都会被Foo对象删除?

谢谢。

+0

当'barlist'被破坏时,'Bar *'指向的资源可能不会被清理。 – Charles

+2

_“或自列表是静态对象”_什么让你这么想? –

+0

通过静态我的意思是列表没有被实例化使用'new',纠正我,如果我错了,但对象中的非指针变量总是销毁对象的权利? –

回答

2

您可以使用qDeleteAll(...)(基本上,您的列表上有一个foreach,并在每个物品上调用delete)。做不是使用QList::clear()它只是从列表中删除项目,但不会触发解除分配。但是,您可以将两者结合起来,首先释放列表项目(指针)所引用对象的内存,然后使用clear()从列表中删除项目(指针),留下空的barList

除此之外,如果BarQObject派生,您可以将其父项设置为另一个对象/小部件,您肯定会在某个点正确释放它。这是Qt中的父子模型,并且是一种清理东西的好方法,无需亲自处理删除操作。

另外static这是不正确的。我认为你的意思是on the stack即你的barList不是动态分配的。

一个忠告:即使你有Bar*这并没有意味着项目本身是动态分配的。您可以在堆栈上创建项目,然后通过引用至少添加它们,如果尝试删除它们,则会导致分段错误。既然你不提供更多的代码,我不能说你的Bar*是否是动态分配的。

当然,这取决于Bar代表什么,所以第二个建议可能不适用于给定的场景。

顺便说一下,你的问题显示一般缺乏理解指针如何工作,实际上不是Qt相关(即使你的问题是在Qt的上下文中)。我的建议是查找一些关于C/C++指针的一般信息,然后转到Qt提供的容器上。

+0

感谢您的回答!我一定会找到关于指针的更多信息,我已经使用了很多PyQt,并且这些都在表单下发生。 –

+0

Bar类是一个Coordinate对象,它在堆栈上只有两个int,并且我正在动态分配它们,再次感谢。 –

+0

虽然你可以使用PyQt而没有做任何C++ Qt代码,但我会建议你不要走这条路。虽然PyQt非常好(毕竟是Python:P),但PyQt只是一个包装,所以仍然存在C++代码。你的Python代码可能看起来不错,但是你突然发现了一个分段错误......为什么?因为底下的C++代码破裂了。:P也有一些在PyQt中不可用的东西,例如完全基于模板的并发模块,并且不可能在Python中创建包装器。所以是的,这两个都值得学习。 :) – rbaleksandar