fej*_*ejd 5 qstring qt memory-management qobject
来自Symbian世界,我习惯尽可能多地使用堆来避免堆栈空间耗尽,尤其是在处理描述符时.CBase派生类总是在堆上动态分配,因为如果它们不是,它们的成员变量将保持未初始化.相同的约定是否适用于QObject派生类?
在Qt中,将(例如QString)放在堆栈上似乎很常见.当QString充当堆栈上的容器时,字符串内容是否放在堆上,或者是否所有内容都放在堆栈上?
Fra*_*eld 10
正如sje397所说:将QString容器和容器放在堆栈上是惯用的,因为它们是隐式共享的.他们的内部(pimpl成语"d"指针)在堆上创建.在堆上创建对象本身也没有意义.只是导致内存管理麻烦,并且在将指针传递给字符串/容器时会丢失预期的写时复制属性.
QObjects另一方面,你想在几乎所有情况下都在堆上创建,否则它们会立即再次被破坏.它们不能被复制或分配(好吧,人们可以为自己的子类强制执行它,但QObject语义已被破坏),并且通常它们应该在创建它们的方法体中存活.例外情况是QDialog,通常是在堆栈,后跟QDialog::exec,阻塞,直到对话框关闭.但即使这样也严格说不安全,因为外部事件(RPC调用,后台操作)可能会导致对象在exec返回之前被父节点删除(如果父节点被删除).然后在堆栈上创建对话框将导致在展开堆栈时双重删除 - >崩溃.
| 归档时间: |
|
| 查看次数: |
1324 次 |
| 最近记录: |