【问题标题】:How dynamic memory allocation in child classes are handled in Qt?Qt 中如何处理子类中的动态内存分配?
【发布时间】:2019-09-13 01:39:28
【问题描述】:

我试图了解 Qt 如何处理其小部件的实例化对象,这些小部件在用户定义的类中使用动态内存分配。

在下面您可以看到 ma​​in.cpp 和来自 Qt 安装示例项目的用户定义类“Foo”的一部分。
作为一个新手,我知道每当我们分配动态内存时,我们都必须在代码中的某处看到delete。问题是delete 在哪里删除在 Foo.cpp 在下面一行?
QChartView *mychart= new QChartView();

ma​​in.cpp

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow window;
    Foo *myobj = new Foo();
    window.setCentralWidget(myobj);
    window.resize(900, 600);
    window.show();
    return a.exec();
}

Foo.cpp

Foo::Foo(QWidget *parent) :
    QWidget(parent)
{
    QChartView *mychart= new QChartView();
...

【问题讨论】:

  • 不清楚这里的“句柄”是什么意思。您在 Foo.cpp 中编写了该代码,因此程序员执行(处理)了动态分配。请更具体地解释您的疑惑。
  • 每当我们分配动态内存时,我们必须确保在代码中的某处删除该内存,句柄是指这个概念。但在 Qt 附带的示例项目中,我看不到任何 delete mychart 代码。所以我假设 Qt 正在处理此类删除,对吗?
  • 这取决于你用 QChartView 做什么——例如如果您将其添加到另一个小部件,则该小部件会对其负责(请参阅stackoverflow.com/questions/2491707/memory-management-in-qt),但至少要使用您在评论中写的内容更新您的问题,因为这就是您的问题的实际意义。
  • 问题已更新

标签: c++ qt inheritance


【解决方案1】:
  1. 父类不处理他们的孩子。类处理他们拥有的对象。任何动态分配的对象 Foo 应在Foo::~Foo() 中清理。
  2. 同样,动态分配的对象拥有 QMainWindowQMainWindow 的析构函数中被清除。当您调用window.setCentralWidget(myobj) 时,您将所有权 传递给myobj 指向的任何内容到window,因此当window 被销毁时,它会在其析构函数中删除该对象。这反过来会导致动态分配的对象拥有myobj 指向的对象被清理(参见第 1 页)

【讨论】:

  • 谢谢! QmainWindow 析构函数(现在拥有myobj 的所有权)如何删除上面代码中的mychart 对象?我的意思是 QMainWindow 析构函数中的代码是什么?
  • @Solarisan “现在拥有 myobj 的所有权” 实际上它拥有 myobj 指向的对象的所有权,而不是 myobj 本身。我更正了答案。例如,代码可以是delete this->centralWidget
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多