Qt 是否应使用非QObject派生类“;“始终”;被放在堆栈上?

Qt 是否应使用非QObject派生类“;“始终”;被放在堆栈上?,qt,memory-management,qobject,qstring,Qt,Memory Management,Qobject,Qstring,来自Symbian世界,我习惯于尽可能多地使用堆,以避免耗尽堆栈空间,尤其是在处理描述符时。CBase派生类总是在堆上动态分配,因为如果不是,它们的成员变量将保持未初始化状态。相同的约定是否适用于QObject派生类 在Qt中,将QString等放在堆栈上似乎很常见。当QString充当堆栈上的容器时,字符串内容是放在堆上,还是所有内容都放在堆栈上 QString和许多其他Qt类都使用。这意味着内存通常是在堆上分配的。正如sje397所说:习惯做法是将QString和容器放在堆栈上,因为它们是隐

来自Symbian世界,我习惯于尽可能多地使用堆,以避免耗尽堆栈空间,尤其是在处理描述符时。CBase派生类总是在堆上动态分配,因为如果不是,它们的成员变量将保持未初始化状态。相同的约定是否适用于QObject派生类


在Qt中,将QString等放在堆栈上似乎很常见。当QString充当堆栈上的容器时,字符串内容是放在堆上,还是所有内容都放在堆栈上

QString和许多其他Qt类都使用。这意味着内存通常是在堆上分配的。

正如sje397所说:习惯做法是将
QString
和容器放在堆栈上,因为它们是隐式共享的。它们的内部(pimpl惯用法“d”指针)是在堆上创建的。在堆上创建对象本身也没有意义。这只会造成内存管理方面的麻烦,而且在向字符串/容器传递指针时,会丢失预期的写时拷贝属性

QObjects
另一方面,在几乎所有情况下,您都希望在堆上创建它们,否则它们会立即再次被破坏。它们不能被复制或分配(好吧,我们可以为自己的子类强制执行它,但是
QObject
语义被破坏了),通常它们应该在创建它们的方法体中存活下来。 例外情况是
QDialog
,它通常在堆栈上创建,然后是
QDialog::exec
,它会一直阻塞直到对话框关闭。但即使严格说来这也是不安全的,因为外部事件(RPC调用、后台操作)可能会导致对话框在exec返回之前被其父级删除(如果父级本身被删除)。
然后在堆栈上创建对话框将导致在展开堆栈->崩溃时双重删除

谢谢你详尽的回答。它和sje397的链接一起消除了我的困惑。