我有C本类对象++(使用Qt):C++删除指针列表
class Foo {
public:
Foo();
~Foo();
QList<Bar*> barList;
}
我的问题是:我是否需要删除barList每个Bar对象的析构函数(for循环),还是因为列表是一个静态对象,所有的东西都会被Foo对象删除?
谢谢。
我有C本类对象++(使用Qt):C++删除指针列表
class Foo {
public:
Foo();
~Foo();
QList<Bar*> barList;
}
我的问题是:我是否需要删除barList每个Bar对象的析构函数(for循环),还是因为列表是一个静态对象,所有的东西都会被Foo对象删除?
谢谢。
您可以使用qDeleteAll(...)
(基本上,您的列表上有一个foreach
,并在每个物品上调用delete
)。做不是使用QList::clear()
它只是从列表中删除项目,但不会触发解除分配。但是,您可以将两者结合起来,首先释放列表项目(指针)所引用对象的内存,然后使用clear()
从列表中删除项目(指针),留下空的barList
。
除此之外,如果Bar
从QObject
派生,您可以将其父项设置为另一个对象/小部件,您肯定会在某个点正确释放它。这是Qt中的父子模型,并且是一种清理东西的好方法,无需亲自处理删除操作。
另外static
这是不正确的。我认为你的意思是on the stack
即你的barList
不是动态分配的。
一个忠告:即使你有Bar*
这并没有意味着项目本身是动态分配的。您可以在堆栈上创建项目,然后通过引用至少添加它们,如果尝试删除它们,则会导致分段错误。既然你不提供更多的代码,我不能说你的Bar*
是否是动态分配的。
当然,这取决于Bar
代表什么,所以第二个建议可能不适用于给定的场景。
顺便说一下,你的问题显示一般缺乏理解指针如何工作,实际上不是Qt相关(即使你的问题是在Qt的上下文中)。我的建议是查找一些关于C/C++指针的一般信息,然后转到Qt提供的容器上。
感谢您的回答!我一定会找到关于指针的更多信息,我已经使用了很多PyQt,并且这些都在表单下发生。 –
Bar类是一个Coordinate对象,它在堆栈上只有两个int,并且我正在动态分配它们,再次感谢。 –
虽然你可以使用PyQt而没有做任何C++ Qt代码,但我会建议你不要走这条路。虽然PyQt非常好(毕竟是Python:P),但PyQt只是一个包装,所以仍然存在C++代码。你的Python代码可能看起来不错,但是你突然发现了一个分段错误......为什么?因为底下的C++代码破裂了。:P也有一些在PyQt中不可用的东西,例如完全基于模板的并发模块,并且不可能在Python中创建包装器。所以是的,这两个都值得学习。 :) – rbaleksandar
当'barlist'被破坏时,'Bar *'指向的资源可能不会被清理。 – Charles
_“或自列表是静态对象”_什么让你这么想? –
通过静态我的意思是列表没有被实例化使用'new',纠正我,如果我错了,但对象中的非指针变量总是销毁对象的权利? –