const和修饰指针的几种用法
昨天闲着没事去面试了一个C++岗位,问了很多基础的东西都没答上来。主要原因是这些知识在硬件资源丰富的pc端用的不多,二来确实很久没温习之前的C++相关的知识了。在面试官问了几次类似的问题没有答好的情况下(还喜欢问你确不确定),最后面试结果也就可想而知了。
1.const和指针
在 C++ 中,const 的作用取决于它修饰的内容(指针本身或指针指向的值)。理解 const 的修饰规则可以通过以下原则:
1. 快速判断的方法
| 声明形式 | 从右往左读解释 | 指针行为 | 值行为 |
|---|---|---|---|
const int* ptr; | 指针指向的值是常量,不能修改值 | 可改变地址 | 不可改变值 |
int* const ptr; | 指针本身是常量,不能改变指向 | 不可改变地址 | 可改变值 |
const int* const ptr; | 指针本身是常量,指向的值也是常量 | 不可改变地址 | 不可改变值 |
int* ptr; | 普通指针,可修改指针指向的地址和指针指向的值 | 可改变地址 | 可改变值 |
总结:看 const 修饰什么
const修饰int*:表示指针指向的值是常量,不能通过指针修改值。const修饰ptr:表示指针本身是常量,不能改变指针指向的地址。- 两个
const同时使用:表示指针和指针指向的值都不能修改。
通过从右往左读声明,可以快速理解 const 的实际作用,应用到代码中时就能明确意图。
2.Qt的资源管理
这个问题主要是Qt的parent设置问题,我也是浅浅的记得是这样管理的。后面面试官又问了我确不确定,第一我确实不确定(其实有点确定),第二就是软件工程里面不确定的东西实在是太多了,所以就说了确实不确定。
1. parent 的作用
- Qt 的对象树以
parent和child关系为基础。当一个对象设置了parent:- 子对象会被自动添加到父对象的子对象列表中。
- 当父对象销毁时,其所有子对象会被 自动销毁。
- 如果
parent是nullptr,则该对象不会被其他对象管理,需要手动管理内存。
2. parent = nullptr 时的内存管理
- 如果创建一个
QObject或其子类对象(如QWidget),且没有设置parent,它不会被 Qt 的对象树自动管理。 - 在这种情况下,你需要显式调用
delete来释放内存,或者将其分配到栈上以自动管理生命周期。
// 在堆上创建,没有 parent
QObject *obj = new QObject();
// 需要手动删除
delete obj;// 在栈上创建,无需关心内存释放
QObject obj2;
3. 常见场景分析
(1)动态分配且 parent = nullptr
QWidget *window = new QWidget(nullptr); // 没有 parent
window不会被 Qt 自动管理,因此需要在适当的时候手动delete。- 如果不
delete,会导致 内存泄漏。
(2)分配在栈上
QWidget window; // 没有 parent
- 对象分配在栈上,生命周期由 C++ 的作用域管理,无需手动释放。
- 作用域结束后,对象自动销毁。
(3)结合 Qt 的智能指针
从 Qt 5.11 开始,可以使用 QScopedPointer 或标准的 std::unique_ptr 来管理内存:
#include <QScopedPointer>
QScopedPointer<QObject> obj(new QObject(nullptr)); // 自动释放内存
或者使用标准智能指针:
#include <memory>
std::unique_ptr<QObject> obj = std::make_unique<QObject>(nullptr); // 自动释放内存
4. 避免问题的建议
-
优先设置
parent
如果可能,尽量为对象设置parent,让 Qt 自动管理其生命周期。特别是 GUI 对象,通常需要将其子对象挂接到父对象上。QWidget *child = new QWidget(parent); // parent 销毁时,child 自动销毁 -
明确生命周期管理
- 如果
parent = nullptr,确保在适当时候调用delete,或使用智能指针。 - 避免同时使用
delete和 Qt 的parent管理,这可能导致二次销毁或未定义行为。
- 如果
-
检查内存泄漏
使用工具(如 Valgrind 或 AddressSanitizer)检查未正确释放的内存。
5. 常见误区
- 误解 Qt 的内存管理全自动化:只有设置了
parent的情况下,Qt 才能管理内存。parent = nullptr时,内存管理完全是开发者的责任。 - 对对象树的过度依赖:设置
parent可以简化内存管理,但在复杂对象关系下,可能导致意外的销毁顺序或内存问题。
总结
当 QObject 的 parent 为 nullptr 时:
- 需要开发者手动管理内存(使用
delete或智能指针)。 - 分配在栈上的对象无需特别管理。
- 为避免内存泄漏或未定义行为,应始终明确对象的生命周期,合理使用
parent或智能指针。
3.教训
既然是面试,很多八股文还是要看滴,不看是会吃亏滴…
相关文章:
const和修饰指针的几种用法
昨天闲着没事去面试了一个C岗位,问了很多基础的东西都没答上来。主要原因是这些知识在硬件资源丰富的pc端用的不多,二来确实很久没温习之前的C相关的知识了。在面试官问了几次类似的问题没有答好的情况下(还喜欢问你确不确定)&…...
mybatis事务的自动提交与手动提交
MyBatis支持自动提交和手动提交两种事务管理方式。 自动提交事务 MyBatis默认使用自动提交模式,即每个SQL操作都会自动提交到数据库中。这意味着在执行完一条SQL语句后,MyBatis会自动调用commit()方法将更改持久化到数据库。 手动提交事务 可以通过Sq…...
网络安全协议之比较(SSH、PKI、SET、SSL)
一、SSH介绍 什么是SSH? 传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据, 别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的…...
Vue的生命周期方法
Vue 生命周期方法详解 beforeCreate 执行时机:在实例初始化之后,数据观测(data observer)和事件配置(event/watcher setup)之前被调用。内部状态:此时,组件的选项对象(例…...
ISP和IQ调试(一)
系列文章目录 文章目录 系列文章目录前言一、ISP(image signal process)二、ISP位置三、IQ总结 前言 一、ISP(image signal process) image signal process 图像处理技术 image signal processor 图像信号处理器 设备 什么是图像信号? 代表…...
c# TaskScheduler
这里记录下 TaskScheduler 的简单用法。 使用场景: 使用 Task 的时候,大家知道用 TaskFactory.StartNew 可以用来创建一个 Task 。这里如果创建了 3 个,那么这3个 Task 就各自放飞直接运行了。 class Program {private static TaskFactory…...
可视化数据
数据科学家会直观呈现数据,以更好地理解数据。 他们可以扫描原始数据、检查摘要度量值(如平均值)或绘制数据图表。 图表是一种可视化数据的强有力方式,数据科学家经常使用图表快速了解适度复杂的模式。 直观地表示数据 绘制图表…...
【Redis】Redis缓存击穿
1. 概述 缓存击穿:缓存击穿问题也叫热点key问题,一个高并发的key或重建缓存耗时长(复杂)的key失效了,此时大量的请求给数据库造成巨大的压力。如下图,线程1还在构建缓存时,线程2,3&…...
厦门凯酷全科技有限公司深耕抖音电商运营
在数字经济飞速发展的今天,抖音电商平台以其独特的社交属性和庞大的用户基础,迅速成为众多品牌和商家的新战场。在这个充满机遇与挑战的市场中,厦门凯酷全科技有限公司凭借其专业的服务、创新的理念和卓越的执行力,成为了抖音电商…...
六西格玛DMAIC在企业得项目管理中有什么作用
六西格玛(Six Sigma)是一种以数据为基础的管理方法,旨在通过减少缺陷和变异来提高过程质量和效率。DMAIC 是六西格玛中一种常用的改进方法论,适用于现有过程的改进。DMAIC 代表五个阶段:定义(Define&#x…...
vscode借助插件调试OpenFoam的正确的.vscode配置文件
正确的备份文件位置: /home/jie/桌面/理解openfoam/正确的调试爆轰单进程案例/mydebugblastFoam 调试爆轰案例流体 并且工作区和用户区都是openfoam-7版本 问题:F5以debug模式启动后不停在断点 解决方法: 这里备份一下.vsode正确的配置&…...
SpringBoot整合JWT(JSON Web Token)生成token与验证
目录 JWT 什么是JWT JWT使用流程 确定要传递的信息: 生成JWT: JWT传输: 客户端保存JWT: 客户端发送JWT: 服务器验证JWT: 服务器响应: Token的使用示例: 工具类 R结果集 返回一个生成的token 创建拦截器 JWT 什么是JWT JWT(JSON Web Token)是是目前最…...
把帕拉丁需要的.rom文件转成.bin
# 输入文件名 input_file_name = fw_payload.bin.rom # 输出文件名 output_file_name = fw_payload.bin.rom2 # 打开输出文件,准备写入翻转后的十六进制字符串 with open(output_file_name, w) as output_file: # 打开输入文件读取十六进制字符串 with open(input_f…...
Nginx 缓存那些事儿:原理、配置和最佳实践
Nginx 缓存那些事儿:原理、配置和最佳实践 在当今的互联网世界,网站的访问量和数据处理量不断攀升,如何确保用户能够快速、稳定地访问我们的网站,已经成为每个运维工程师面临的挑战。幸运的是,Nginx 作为一款高性能的…...
vue发展史
Vue.js发展史 Vue.js是一个渐进式JavaScript框架,自发布以来受到了广泛的关注和喜爱。以下是Vue.js的发展史: 1. 起源(2013年) Vue.js的创始人尤雨溪(Evan You)在2013年开始构思这个项目。当时࿰…...
基于Java和Vue开发的校园跑腿软件校园跑腿小程序系统源码
市场前景 学生需求多样化: 随着校园生活节奏的加快和学生需求的多样化,跑腿服务逐渐成为一种新兴的商业模式。学生群体对于便捷、高效的日常服务需求不断增加,如外卖送餐、快递代取、文件传递等。市场规模持续增长: 大学校园作为…...
MySQL(五)--- 事务
1、CURD操作不加控制时,可能会出现什么问题 即:类似于线程安全问题,可能会导致数据不一致问题。 因为,MySQL内部本身就是多线程服务。 1.1、CURD满足什么属性时,才能避免上述问题 1、买票的过程得是原子的吧。 2、买票互相应该不能影响吧。 3、买完票应该要永久有效吧。…...
llm chat场景下的数据同步
背景 正常的chat/im通常是有单点登录或者利用类似广播的机制做多设备间内容同步的。而且由于长连接的存在,数据同步(想起来)相对简单。而llm的chat在缺失这两个机制的情况下,没见到特别好的做到了数据同步的产品。 llm chat主要两…...
机器学习经典算法
机器学习经典算法学习和分享。 k近邻算法 线性回归 梯度下降法 PCA主成分分析法 多项式回归 逻辑回归 支撑向量机SVM 决策树 随机森林 评价分类指标...
Scala中的泛型
类型参数 ---- 泛型(数据类型是变化的) (1) 可以有多个 (2) 名称合法就行,没有固定的,一般用T(Type) 在Scala中,用[]表示。在Java中用<>表示 1. 与数据类型的区别 List是数据类型,表示一个列表。[Int]表示泛型,它…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
