【问题标题】:c++ Delete a list of pointersc++ 删除指针列表
【发布时间】:2017-04-05 11:18:00
【问题描述】:

我在 c++ 中有这个类对象(使用 Qt):

class Foo {

    public:
        Foo();
        ~Foo();

        QList<Bar*> barList;
}

我的问题是:我是否需要在析构函数(for 循环)中删除 barList 中的每个 Bar 对象,或者由于列表是静态对象,所以所有内容都将与 Foo 对象一起删除?

谢谢。

【问题讨论】:

  • Bar*s 指向的资源在barlist 被销毁时可能不会被清理。
  • “或者因为列表是静态对象”是什么让你这么认为?
  • 静态我的意思是该列表没有使用new 实例化,如果我错了,请纠正我,但对象中的非指针变量总是被对象破坏,对吗?跨度>
  • static != on the stack(请阅读我下面的帖子:))。

标签: c++ list qt pointers


【解决方案1】:

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

除此之外,如果Bar 是从QObject 派生的,您可以将其父级设置为另一个您确定会在某个时候正确释放的对象/小部件。这是 Qt 中的父子模型,是一种清理内容的好方法,无需自己处理删除操作。

这里还有static 是不正确的。我认为您的意思是 on the stack 即您的 barList 不是动态分配的。

请注意:即使您有Bar*,这也意味着项目本身是动态分配的。您可以在堆栈上创建项目,然后通过引用您的最少附加它们,如果您尝试删除它们,这将导致分段错误。由于您没有提供更多代码,我不能说您的 Bar*s 是否是动态分配的。

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

顺便说一句,您的问题表明普遍缺乏对指针如何工作的理解,实际上与 Qt 无关(即使您的问题是在 Qt 的上下文中)。我对您的建议是查找一些有关 C/C++ 中指针的一般信息,然后转到 Qt 提供的容器。

【讨论】:

  • 感谢您的回答!我肯定会找到更多关于指针的信息,我已经使用了很多 PyQt,这发生在表格下面。
  • Bar 类是一个 Coordinate 对象,堆栈上只有两个 int,我正在动态分配它们,再次感谢。
  • 虽然您无需真正编写任何 C++ Qt 代码就可以使用 PyQt,但我建议不要走这条路。虽然 PyQt 非常好(毕竟是 Python :P),但由于 PyQt 只是一个包装器,因此仍然存在 C++ 代码。您的 Python 代码可能看起来还不错,但突然出现分段错误……为什么?因为下面的 C++ 代码坏了。 :P 还有一些在 PyQt 中不可用的东西,例如完全基于模板的并发模块,因此无法在 Python 中创建包装器。所以,是的,两者都值得学习。 :)
  • 如果你只想存储两个ints,老实说,我会使用结构或数组而不是整个臃肿的类。
  • 为我的坐标选择一个类是因为我可以创建特定的方法,我的想法是制作我自己的Vector2class,但感谢您的反馈:) 我已经开始学习了C++,因为我听说python没有编译,效率低很多,你对此有何看法?
猜你喜欢
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多