非 QObject 派生类是否应该“始终”放入堆栈中?

2023-12-07

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

在 Qt 中,将 QString 等内容放在堆栈上似乎很常见。是字符串内容放在堆上,而 QString 作为堆栈上的容器,还是所有内容都放在堆栈上?


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非 QObject 派生类是否应该“始终”放入堆栈中? 的相关文章

  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • QTimer 一点也不准确?

    运行在 Windows7 64 位机器上 具有非常强大的 CPU 8 核 16 线程 我使用 QTimer 以 50Hz 触发函数调用 但我最终得到了 30Hz 函数调用本身肯定需要不到 10 毫秒才能完成 整个过程发生在一个单独的线程中
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • Swift C 回调 - Swift 类指针的 takeUnretainedValue 或 takeRetainedValue

    我有一些UIView or UITableViewCell 里面我有 C 回调 例如 CCallback bridge self observer data gt Void in let mySelf Unmanaged
  • Qt 5.3 无法使 QCompass (QSensor) 在 Windows 8.1 上工作

    我无法让传感器在我的 Asus Transformer T100 上工作 磁力计和指南针无法启动 并且我从加速度计获得假值 始终 x 0 y 9 8 z 0 即使使用我的笔记本电脑 我总是得到相同的结果 第一段文字编辑 Initialisa
  • 如何将 zlib 添加到现有的 qt 安装中

    如何将 zlib 添加到 Qt 的现有安装中 我对此很陌生 所以请给我详细的描述 提前感谢您的帮助 zlib 包含在 Qt 核心库中 如果你想在 Qt 程序中使用 zlib 函数 你只需要包含 src 3rdparty zlib 中的 zl
  • Mac 上的 Qt — 如何访问帮助菜单中的“搜索”

    我正在将我的 Qt 应用程序移植到 Mac OS X 在 Windows Linux 上 我使用 QLineEdit 在帮助菜单中提供搜索功能 In Mac OS X I saw something like this is built i
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 将 QByteArray 从大端转换为小端

    我想我在这里有点不知所措 我尝试了这么简单的事情 我不敢相信没有任何内置的 Qt 使用 Qt 5 6 2 我尝试将 QByteArray 内的数据从大端转换为小端 总是从相同的测试 QByteArray 开始 就像这样 QByteArray
  • 如何访问Loader的sourceComponent中的QML对象?

    我可能需要读取或写入的一些属性Loader s sourceComponent来自一些外部函数 访问该房产的方式是什么x里面的对象的Loader s sourceComponent import QtQuick 2 0 Item width
  • 有没有一种简单的方法来准备 Fortran 代码以进行并行调用

    我想使用 OpenMP 在 C 程序中并行求解多个大型 ODE 系统 由于某些原因 我需要使用 ODE 求解器 但我只能找到 Fortran 90 子例程 而且代码太大 无法简单地将其转换为 C 我知道 Fortran 广泛使用静态内存 因
  • 来自另一个类的 Qt C++ GUI 调用

    我通过 gui 拖放创建了一个按钮和一个文本浏览器 UI 以及单击按钮功能是在 mainwindow cpp 中创建的 有一个 main cpp 但这是无关紧要的 因为在单击开始按钮之前程序不会启动 include mainwindow h
  • 使用 PyQt 和 matplotlib 在可滚动小部件中显示多个绘图

    由于我没有得到答案this https stackoverflow com questions 12179893 creating a scrollable multiplot with pythons pylab我尝试用 PyQt 解决这

随机推荐

  • 字符串中分隔的空格分隔的单词[重复]

    这个问题在这里已经有答案了 我有一个以下格式的文本字符串 str word1 word2 word3 word4 所以我想将每个单词从字符串中分离出来 两个单词之间用空格分隔 我怎么做 有没有内置函数可以做到这一点 最简单的是使用explo
  • filedialog、tkinter 和打开文件

    我第一次使用 Python3 为程序编写浏览按钮 我一直在搜索互联网和这个网站 甚至 python 标准库 我找到了示例代码和非常肤浅的解释 但我找不到任何可以直接解决我遇到的问题的内容 也找不到足够好的解释 以便我可以根据自己的需要自定义
  • 扩展后删除不需要的字符

    我有一些页面是通过从 cgi 串起的查询来调用的 xyz cgi page abc html 我遇到的问题是 我收到了对确实存在的页面的机器人请求 但该请求在 html结果是 404 有办法进去吗 htaccess剥离之后的一切 html扩
  • 有人可以解释一下 mult 在连接中执行更新时如何在 data.table 中工作(使用 .EACHI 和 mult)

    我再次努力理解mult参数在执行连接更新时起作用 我想做的是实现中定义的左连接lj 出于性能原因 我想更新左表 不平凡 的部分是 当左表和右表有一个共同的列时 不考虑连接列 我想使用右表中的第一个值来覆盖左表 我想mult会帮助我处理这个多
  • 在应用程序状态保存期间,有哪些好方法可以解决 SKAction 代码块的编码限制?

    Problem 当节点层次结构被编码时 这在应用程序状态保存或 游戏保存 期间很常见 运行的节点SKAction带有代码块的动作必须特殊处理 因为代码块不能被编码 示例1 动画后延迟回调 在这里 一名兽人被杀 它以动画方式淡出 然后将其自身
  • 类型错误:“str”不支持缓冲区接口

    plaintext input Please enter the text you want to compress filename input Please enter the desired filename with gzip op
  • 使用 jQuery 解析 PHP 脚本返回的 XML(imgur.com API)

    这是我的 jQuery var docname doc val function parseXml xml xml find rsp each function alert success submit click function aja
  • Chrome 自动化扩展程序崩溃了

    我在 C 中使用 Selenium 来针对 Google Chrome 进行自动化 我正在使用最新版本Chrome 78 0 3904 70 Selenium Webdriver 3 141 0 and Selenium Chrome We
  • 忽略根 RouterModule 中的路径

    我正在使用 Angular 9 我的根目录中有一个 JSON 文件 我不想将其包含在应用程序中 换句话说 src app assets index html do not include this file json 这意味着http ex
  • Clearcase find 命令先决条件

    我该如何使用cleartool find搜索一个裸vob 我必须始终首先定义视图吗 我通常使用 CCRC 在这种情况下 我正在查找特定分支类型的所有文件的列表 EDIT 这一页 says 通常 您从目录树中的所有对象开始 如下所示 你的观点
  • 如何在 Dialogflow NodeJS 客户端中设置自定义平台

    我使用创建了一个网络钩子对话流履行根据平台正确返回不同的数据 包括我为另一服务创建的自定义数据 我已经测试了我的网络钩子并且知道如果我更改originalDetectIntentRequest source对于我的自定义有效负载中使用的平台
  • 可重复使用的复选框部分视图

    我有一个部分视图 它使用类 CheckBoxModel 的列表 CheckBoxListModel 以及字符串和布尔值来创建复选框列表 该代码用于创建复选框并在页面发布时将选定的复选框发送回控制器 我正在尝试找到一种方法使我的部分可重用 正
  • 将 C# 应用程序包装在 .msi 安装程序中

    我已在 Visual Studio 2017 中创建了一个 C 应用程序 现在我想将我的应用程序作为单个 Windows 安装程序文件进行分发 我希望有一个简单的一键式解决方案 选择我想要包含的所有文件 gt 瞧 这是安装程序 但好像没那么
  • 如何在 PHP 中运行这个正则表达式?

    我在网上复制了这个复杂的 PHP a z0 9 a z0 9 a z0 9 a z0 9 a z0 9 a z0 9 a z0 9 a z0 9 我如何在 PHP 中运行它 我试试这个 test Joe Doe lt email prote
  • 如何在Vue组件中导入外部函数?

    我是 javascript 和 vue js 的新手 在尝试在现有程序中添加新功能时遇到一些问题 我已将我的新函数 与其他函数 放在一个单独的文件中 export const MyFunctions MyFunction function
  • 如何让我的应用程序读取应用程序配置而不是 machine.config?

    我在用 c 创建的应用程序中添加了一个单词 该应用程序正在访问 Web 服务 并且如果安装在 Program Files 文件夹之外 则可以完美运行 奇怪的是 当我将其安装在 Program Files 文件夹中时 客户端无法读取 appl
  • 避免空检查条件运算符样板的最佳实践

    当无法使用 null 对象时 替换条件运算符 null 检查样板的最佳实践是什么 public String getEmployeeName return employee null null employee getName Java 8
  • Android - 想要限制编辑文本中的某些字符

    我遇到了以下场景 我有一个编辑文本及其密码字段 我想限制一些字符 例如 a z A Z 1 0 和一些特殊字符 我将此 edittext 的 inputType 设置为 textPassword 并使用 Numberkeylistner 来
  • 如何从 MSBuild 自动增加程序集或程序集文件版本?

    限制条件是 使用 Visual Studio 2017 最终需要从调用 MSBuild 的 powershell 脚本中调用 不确定其相关性 但需要能够构建以下内容 ASP NET 461 asp net core 1 1 和 2 0 程序
  • 非 QObject 派生类是否应该“始终”放入堆栈中?

    来自 Symbian 世界 我习惯于尽可能多地使用堆以避免耗尽堆栈空间 特别是在处理描述符时 CBase 派生类总是在堆上动态分配 因为如果不这样做 它们的成员变量将保持未初始化状态 相同的约定是否适用于 QObject 派生类 在 Qt