当前位置: 首页 > news >正文

华为OD技术面八股文_C++_02

文章目录

  • 指针和引用的区别
  • 野指针是什么?怎么导致的?怎么避免?
  • 函数指针和指针函数的区别?
  • 指针常量和常量指针的区别
  • 值传递、指针传递和引用传递的区别
  • 数组和指针有什么区别
  • sizeof 一个指针长度是多少
  • 智能指针都有哪些?分别简单介绍一下
  • 智能指针的作用?不同智能指针使用场景
  • 智能指针会存在内存泄漏吗

指针和引用的区别

  1. 是否可变:指针所指向的内存空间在程序运行过程中可以改变,而引用一旦绑定,不能改变。
  2. 是否可以为空:指针可以为空,引用必须绑定对象。
  3. 是否可以为多级:指针可以有多级,引用不能。
  4. 是否可作为容器元素:指针可以,引用不能。
  5. 是否支持算法运算:指针支持,引用不能。

野指针是什么?怎么导致的?怎么避免?

野指针:指向不确定、非法或者已经失效内存的指针。

产生野指针的原因:

  1. 指针未初始化
// 野指针 int* p;
  1. 释放之后继续使用
int* p = new int(10); delete p; *p = 20;
  1. 函数返回局部变量地址:局部遍历在栈上,函数结束,栈帧销毁,内存失效。
int* foo() { int x = 10; return &x; } int* p = foo(); cout << *p;
  1. 指针越界访问: 访问非法内存,野指针行为。
int arr[5]; int* p = arr; p += 10; *p = 100;

野指针的危害:

  1. 随机崩溃:debug不崩,release时崩溃。最难排查的bug类型。
  2. 内存破坏:不知情情况下,悄悄修改别人内存/

避免野指针防御方案:

  1. 所有指针必须初始化。
  2. delete后立即置空。
  3. 不返回局部变量地址
  4. 数组访问用于检查边界。
  5. 能不用裸指针就不用裸指针。

额外说一下悬空指针:指向已经被释放或失效内存的指针,指针还指着一块地址,但这块内存已经不归你所有了。悬空指针 ⊂ 野指针

函数指针和指针函数的区别?

函数指针:本质是一个指针变量,只不过这个指针指向一个函数。

#include <iostream> using namespace std; // 普通函数 int add(int a, int b) { return a + b; } int main() { // 定义函数指针 int (*p)(int, int) = add; // 通过函数指针调用函数 cout << p(3, 5) << endl; // 8 cout << (*p)(3, 5) << endl; // 8 return 0; }

指针函数:本质是一个函数,只不过这个函数返回值是一个指针。

#include <iostream> using namespace std; int global = 100; // 指针函数:返回 int* int* getAddr() { return &global; } int main() { int* p = getAddr(); cout << *p << endl; // 100 return 0; }

指针常量和常量指针的区别

常量指针:指针指向内容不可变。
指针常量:指针本身不可变。

const int* p; // 常量指针 int* const p; // 指针常量

值传递、指针传递和引用传递的区别

参数传递的三种方式:

  1. 值传递:形参是实参的拷贝,函数对形参的所有操作不会影响实参。
  2. 指针传递:本质是值传递,只不过拷贝的是指针的值,实参和形参是不同的指针,通过指针可以间接的访问指针所指向的对象,从而可以修改它所指对象的值。
  3. 引用传递:函数参数以“引用”的方式传递,函数内部对参数的修改会直接作用到实参本身。本质是常量指针的语法糖。

数组和指针有什么区别

本质:数组是一段连续内存。指针本质是地址变量。
是否可修改:数组名不可变,内部元素可修改。指针可变。
是否占独立空间:数组占整块。指针仅指针本身。
sizeof结果:数组 整个数组大小。指针仅指针本身大小。
能否自增:数组不可以。指针可以。

sizeof 一个指针长度是多少

sizeof(指针) 的大小只与平台位数有关,因为指针本质上存储的是内存地址,与指针类型无关。对于不同平台

  • 32位系统:4字节
  • 64位系统:8字节

智能指针都有哪些?分别简单介绍一下

在C++中,有三种常见的智能指针,分别如下:

  • std::unique_ptr: 是一种独占所有权的智能指针。它通过使用独占所有权的方式来管理资源,只能有一个std::unique_ptr指向同一个对象或数组。当std::unique_ptr超出作用域或被显式释放时,它会自动删除所管理的对象或数组。它通常用于表示独占的资源所有权,如动态分配的单个对象或数组。不允许拷贝,允许移动。
  • std::shared_ptr: 是一种共享所有权的智能指针。它可以有多个std::shared_ptr指向同一个对象,通过引用计数来管理资源的生命周期。只有当最后一个std::shared_ptr超出作用域或被显式释放时,资源才会被删除。std::shared_ptr允许多个指针共享对同一资源的访问,通常用于表示共享的资源所有权。
  • std::weak_ptr: 是一种弱引用的智能指针。它可以指向由std::shared_ptr管理的对象,但不会增加引用计数。std::weak_ptr主要用于解决std::shared_ptr的循环引用问题,通过std::weak_ptr.lock()方法可以获取一个有效的std::shared_ptr来访问被管理的对象。weak_ptr 不参与对象生命周期管理,仅作为观察者存在。

智能指针的作用?不同智能指针使用场景

智能指针的作用:智能指针本质是一个类,利用构造函数申请资源,析构函数释放资源,实现 RAII 机制。自动管理动态内存的生命周期,防止内存泄漏、悬空指针和重复释放等问题,实现 RAII 资源管理。

std::unique_ptr:独占资源

  • 特点
    • 独占所有权
    • 不可拷贝
    • 智能移动
    • 零额外开销
  • 适用场景:
    • 需要独占对象
    • 资源管理类
    • 工厂模式

std::shared_ptr:共享资源

  • 特点:
    • 引用计数
    • 共享所有权
    • 有额外性能开销
  • 适用场景:多个对象共享同一资源,且生命周期无法明确划分
    • 观察者模式
    • 资源缓存系统
    • 线程池任务对象

std::weak_ptr: 观察者/打破循环引用

  • 特点
    • 不增加引用计数
    • 不控制声明周期
    • 只做观察
  • 适用场景:解决 shared_ptr 循环引用
    • 父子对象相互引用
    • 观察者模式
    • 事件回调系统

能用 unique_ptr 就不用 shared_ptr,必须共享时才用 shared_ptr.存在环时必须配 weak_ptr。

智能指针会存在内存泄漏吗

会的,在使用shared_ptr并且形成循环引用场景,资源将无法使用。本质上是shared_ptr采用引用计数控制生命周期,形成循环引用下,计数永远不会为零,资源将无法被使用,从而导致内存泄漏出现。针对这个问题可以采用weak_ptr解决.

http://www.jsqmd.com/news/428395/

相关文章:

  • 2026粒子计数器Top5推荐:粒径下限、工况适配与计量精度全维度对比 - 深度智识库
  • 2026 合肥展台设计搭建公司焕新指南:科创赋能展览,徽韵点亮会展新生态 - 资讯焦点
  • 揭秘永辉超市购物卡回收渠道,快速变现秘诀竟如此简单! - 团团收购物卡回收
  • selenium破解滑动验证码的原理及解决思路
  • 闲置中国电信卡别乱处理!2026 真实口碑盘点,这样选更稳妥 - 可可收
  • 哪个短信平台比较好?2026 年主流短信供应商对比 - Qqinqin
  • 天虹提货券回收怕被骗?京顺回收带你避开3大陷阱 - 京顺回收
  • 实际气体状态方程:Peng-Robinson(P-R)方程计算指南
  • AbMole小讲堂丨Deruxtecan (DXd):新一代ADC的核心载荷分子
  • 2026年妇女节NMN送礼排行榜:W+瑞粒塔NMN独当一面,瑞粒养护NMN哪个牌子好 - 速递信息
  • 最新高口碑液体钙推荐测评:从婴幼儿到中老年,2026不再缺钙 - 速递信息
  • 花岗岩构件源头厂家选哪家,分享值得选购的靠谱品牌 - myqiye
  • 华中科大TextPecker:AI图像文字生成实现零错误突破
  • 2026年白刚玉砂轮片批发干货榜:6家工厂实力对比与避坑指南 - 企师傅推荐官
  • DSPE-PEG-DA,1,2-二硬脂酰-sn-甘油-3-磷酰乙醇胺-聚乙二醇-二乙烯基醇修饰
  • 聊聊冷轧带肋钢筋设备加工厂排名,河北海力特能进前十吗? - mypinpai
  • 2026年青少年厌学解决方案推荐:郑州暖洋葱教育科技,精准改善180万+家庭亲子关系 - 品牌推荐官
  • 西南民族大学:OmniOCR让计算机“看懂“藏文、彝文等少数民族文字
  • 济南全屋定制性价比高的品牌有哪些,怎么选更合适? - 工业设备
  • KAIST首创:让AI一步完成文本生成,告别传统“逐字生成“的慢节奏
  • 2026 合肥展厅设计搭建公司新选:展厅长效焕新,皖境创意筑就品牌主场 - 资讯焦点
  • Cell 顶刊证实:NMN激活线粒体能量,W+端粒塔为何是科学有效的抗衰品牌 - 速递信息
  • 新加坡国大突破3D补全难题:让残缺物体“重获新生“的AI魔法师
  • 基于MATLAB的FCM与K-means图像聚类分割实现
  • 2026年四川川藏线包车/成都包车攻略:口碑旅行社深度评测与推荐榜 - 深度智识库
  • 众客餐车的节能效果好吗,价格贵不贵,好用不? - 工业设备
  • 德国inne品牌深度解析:以科研之力,守护全龄营养 - 速递信息
  • 总结酿酒降温全自动晾床,曲阜久鼎价格实惠推荐哪家? - 工业品牌热点
  • 2026年北京小程序开发公司怎么选?麦冬科技定制化服务深度解析 - 品牌2026
  • CMS 垃圾收集器