c++ - 关于在堆栈上创建 QObjects 组件而不是动态创建它们的利弊
问题描述
如果我在堆栈上分配 QObjects 以避免内存管理问题,是否有任何问题?我应该更喜欢动态分配的 QObjects 并通过 qt 对象树及其所有权机制委托内存管理吗?
解决方案
除非它位于最顶层(main
例如,在您创建初始窗口时),否则您真的不应该这样做。
基本原因是 Qt 根本不是为自动对象设计的。Qt 是围绕动态分配和为您管理内存而设计的,违反这一点可能会导致一些令人讨厌的结果。立即浮现在脑海的是自动对象的破坏顺序,自动对象的破坏顺序与它们的构造相反。那么在这样的情况下会发生什么呢?
...
QLabel lbl("Hello world");
QWidget win;
lbl.setParent(&win);
...
答案并不漂亮。当这些对象被破坏时,win
会先被破坏,并调用 的析构函数lbl
,不幸lbl
的是它是一个自动对象(这意味着手动删除它是未定义的行为);之后它将被适当地破坏, win
但到那时为时已晚。这只是一个示例,但它强调了一些奇怪的错误,如果您违反 Qt 的假设,即它为您管理您的内存,这些错误可能会发生。
总体而言,与自动分配相比,动态内存分配的最小开销是值得的,以防止像上面那样难以追踪和奇怪的错误。IMO,您应该始终让 Qt 为您管理您的内存,因为这就是它的设计方式,并且这就是它假设您将使用它的方式。
推荐阅读
- python - 使用 Python HTTPServer 模块时如何解决通信缓慢的问题?
- ios - 如何获取firebase ios可读的崩溃日志
- wavesurfer.js - Wavesurfer.js:波形宽度
- javascript - Input Type = File,JavaScript 后 FileUpload 消失
- random - C++
不能在使用 VS 配置的 SWIG-Python 库的调试“独立”应用程序中工作 - c# - 如何使用特定版本的 System.Globalization?
- web-services - 代号一:网络服务不可用
- apache-spark-sql - 使用带有多个参数的 SparkUDF 时面临的问题
- python - 使用 for 循环在字典中附加值
- c# - 禁止对象终结,直到其他线程运行