在Qt中我们使用更多的指针,有啥好处吗?

Posted

技术标签:

【中文标题】在Qt中我们使用更多的指针,有啥好处吗?【英文标题】:in Qt we uses more pointers, is there any advantages?在Qt中我们使用更多的指针,有什么好处吗? 【发布时间】:2010-08-17 13:43:13 【问题描述】:

我对 Qt 编程有一些澄清。 在 Qt 中,大多数时候我们通过动态分配内存来实例化小部件。

从 Qt 的角度来看,这样做有什么好处吗?那么为小部件取消分配内存呢?我们是否需要为分配的内存或 Qt 句柄手动调用 delete?

例子

QListView *newlist = new QListView(); //This is good? if so why?
QListView newlist; // why not this?

【问题讨论】:

【参考方案1】:

看起来进行堆栈分配是安全的。见this answer。但是,对于 Symbian,它可能会有所不同。 This question 提出了一些优点。

我认为在 Symbian 中,堆栈空间有限,而且许多对象本身都使用在堆上分配的数据共享。在这方面,继续动态进行可能是个好主意。

【讨论】:

它是安全的,但通常不是您想要的。离开块时,小部件将立即销毁。 exec() 引发的 QDialogs 例外(会阻塞)。【参考方案2】:
QListView* newlist = new QListView(); //This is good? if so why?

仅当您将 newlist 指针存储在某处并稍后手动将其删除时。

如果可能,我建议您在堆栈上分配小部件。然而,当使用我将要解释的技术时,这是不可能的。

在设计复杂的小部件时,您通常会创建一个object tree 的小部件。这意味着每个小部件,除了根小部件,都有一个父小部件。删除父级时,它将自动删除其所有子级。这种方法非常方便,因为您只需要跟踪根小部件。

在你的情况下,你会做这样的事情:

QListView* newlist = new QListView(parentWidget);

【讨论】:

【参考方案3】:

请参阅我的my reply 关于 QObjects。 简而言之:在堆上创建小部件,因为它们通常必须在当前方法中存活,并且它们不能被分配或复制。 QWidgets 在他们自己被删除时会删除他们的孩子(或者更一般地说,QObjects 会删除他们的孩子),所以如果你将父母传递给小部件,通常不会出现内存管理问题。

【讨论】:

@frank,感谢您的回答。我在您的描述中没有得到的一件事是“它们不能被分配或复制”它究竟说明了什么,我们不能分配值,我们不能使用复制构造函数复制它们吗? @Shadow: 两者都不是,copy ctor 和 operator= 对于 QObjects 都是私有的。这就是为什么它们作为指针传递。 QObjects 不是值,它们有一个“身份”。即使您实施例如operator= 对于子类,将一个 QObject 分配给另一个会破坏语义。例如,不复制信号/插槽连接。 @Frabk,我在这里仔细分析了doc.trolltech.com/4.5/shared.html#overview,我又发现了一个疑问。 QPixmap p1, p2; p1.load("image.bmp"); p2 = p1; // p1 和 p2 在这里共享数据 p2 和 p1 共享来自 Qt 预期,而不是来自程序员预期权利。通常将一个对象分配给另一个对象会导致深度复制权?但是Qt说这将是浅拷贝..如果我在这里改变p2的值怎么办? @Frabik,很抱歉再次打扰你,我想澄清这个概念,所以我在窃听.. 嘿还有一件事“信号/插槽连接没有被复制”它告诉你什么,你的意思是分配一个信号给另一个?我到现在都没做过 @Shadow:不,这意味着,如果您添加公共复制构造函数或将运算符分配给您自己的 QObject 子类(您不应该),然后执行 MyQObject b = a;。 a 所涉及的信号/插槽连接不会被复制。信号/槽是首先从 QObject 派生的主要原因。

以上是关于在Qt中我们使用更多的指针,有啥好处吗?的主要内容,如果未能解决你的问题,请参考以下文章

与简单地创建派生类指针相比,将基类绑定到派生类有啥好处?

51单片机在申请变量时总是有data,idata,xdata等限定词,可以不用吗?有啥好处吗?为啥别的单片机没有

学习C语言的指针部分有啥好的方法吗?真的很难啊!!

qt中如何获得控件所在的布局的指针。。

指针可以带参数吗?这3种指针有啥区别

将 NULL 指针转换为对象并调用其成员函数之一有实际好处吗?