如若非QObject的派生类“永远”在堆栈上放?
-
26-09-2019 - |
题
从Symbian世界编辑,我已经习惯使用堆尽可能处理描述符时避免堆栈空间用完,更是如此。 CBase的派生类总是动态地分配在堆上,因为如果他们没有,他们的成员变量将保持初始化。不相同的约定适用于QObject的派生类?
在Qt的它似乎是共同放,例如QString的,在堆栈上。放在堆上的字符串内容而QString的充当容器在栈上,或者是一切放在堆栈上?
解决方案
正如sje397表示:这是惯用的放QString
和容器在堆栈中,因为它们是隐式共享。其内部(PIMPL成语“d”指针)在堆中创建。有创建堆上的对象本身,也没有意义。只是导致内存管理的麻烦和传递指针时,串/容器周围你失去预期的写入时复制的属性。
QObjects
。他们不能被复制或分配的(当然,一个可以强制执行它自己的子类,但QObject
语义被破坏的话),而且通常他们应该为了生存,他们在创建的方法体。
例外是QDialog
,其通常在堆栈上产生,随后QDialog::exec
,其阻止,直到关闭对话框。但即使是严格来说是不安全的,因为外部事件(RPC调用,后台操作)可能会导致该对话框其父EXEC返回之前被删除(如果家长本身被删除)。
然后具有栈上创建的对话会造成双重缺失栈展开的时候 - >崩溃。
其他提示
的QString,以及许多其他Qt类,使用隐式数据共享。这意味着,存储器通常在堆上分配。
不隶属于 StackOverflow