从Symbian世界编辑,我已经习惯使用堆尽可能处理描述符时避免堆栈空间用完,更是如此。 CBase的派生类总是动态地分配在堆上,因为如果他们没有,他们的成员变量将保持初始化。不相同的约定适用于QObject的派生类?

在Qt的它似乎是共同放,例如QString的,在堆栈上。放在堆上的字符串内容而QString的充当容器在栈上,或者是一切放在堆栈上?

有帮助吗?

解决方案

正如sje397表示:这是惯用的放QString和容器在堆栈中,因为它们是隐式共享。其内部(PIMPL成语“d”指针)在堆中创建。有创建堆上的对象本身,也没有意义。只是导致内存管理的麻烦和传递指针时,串/容器周围你失去预期的写入时复制的属性。

您要创建在几乎所有情况下的堆,因为否则会被再次马上销毁另一方面

QObjects。他们不能被复制或分配的(当然,一个可以强制执行它自己的子类,但QObject语义被破坏的话),而且通常他们应该为了生存,他们在创建的方法体。 例外是QDialog,其通常在堆栈上产生,随后QDialog::exec,其阻止,直到关闭对话框。但即使是严格来说是不安全的,因为外部事件(RPC调用,后台操作)可能会导致该对话框其父EXEC返回之前被删除(如果家长本身被删除)。 然后具有栈上创建的对话会造成双重缺失栈展开的时候 - >崩溃。

其他提示

的QString,以及许多其他Qt类,使用隐式数据共享。这意味着,存储器通常在堆上分配。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top