来自 Symbian 世界,我习惯于尽可能多地使用堆以避免耗尽堆栈空间,特别是在处理描述符时。 CBase 派生类总是在堆上动态分配,因为如果不这样做,它们的成员变量将保持未初始化状态。相同的约定是否适用于 QObject 派生类?
在 Qt 中,将 QString 等内容放在堆栈上似乎很常见。是字符串内容放在堆上,而 QString 作为堆栈上的容器,还是所有内容都放在堆栈上?
正如 sje397 所说: 这是惯用的做法QString
和堆栈上的容器,因为它们是隐式共享的。它们的内部结构(pimpl 惯用语“d”指针)是在堆上创建的。在堆上创建对象本身也是没有意义的。只会导致内存管理麻烦,并且在将指针传递给周围的字符串/容器时,您会丢失预期的写时复制属性。
QObjects
另一方面,几乎在所有情况下您都希望在堆上创建,否则它们会立即再次被破坏。它们不能被复制或分配(好吧,人们可以为自己的子类强制执行它,但是QObject
那么语义就被破坏了),并且通常它们应该在创建它们的方法体中继续存在。
例外的是QDialog
,通常在堆栈上创建,后面是QDialog::exec
,它会阻塞,直到对话框关闭。但即使这样严格来说也是不安全的,因为外部事件(RPC 调用、后台操作)可能会导致对话框在 exec 返回之前被其父级删除(如果父级本身被删除)。
然后,在堆栈上创建对话框将在展开堆栈时导致双重删除 -> 崩溃。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)