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

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

最佳答案

正如sje397所说:将QString和容器放在堆栈上是很习惯的,因为它们是隐式共享的。它们的内部(pimpl惯用语“d”指针)在堆上创建。同样,在堆上创建对象本身也没有意义。仅会导致内存管理麻烦,并且在将指针传递给字符串/容器时会丢失预期的写时复制属性。

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

关于qt - 是否应将非QObject派生的类 "always"放在堆栈上?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3412579/

10-12 03:01