固生堂面试(C++)

1.裸指针导致内存泄漏如何处理,用过哪些智能指针,智能指针的原理是什么?

用智能指针托管内存,让系统自动释放,从根源解决泄漏。

用过的智能指针:

  1. std::unique_ptr (独占智能指针)
  2. std::shared_ptr (共享智能指针)
  3. std::weak_ptr (解决 shared_ptr 循环引用)

展开讲:

  1. 智能指针是一个栈上对象
  2. 构造时 接管裸指针
  3. 析构时 自动 delete 内存
  4. 栈对象离开作用域 自动调用析构
  5. 内存 100% 安全释放,不会泄漏.

std::unique_ptr (独占指针)

  • 同一时间只有一个指针拥有对象
  • 不能拷贝,只能移动(move)
  • 最轻量、效率最高,和裸指针一样快
  • 适用:单纯管理对象,不需要共享

unique_ptr<int> p1(new int(10)); unique_ptr<int> p2 = move(p1); // 转移所有权

std::shared_ptr (共享指针)

  • 引用计数(reference count) 原理
  • 多个指针共享同一个对象
  • 计数 = 0 时才释放内存

shared_ptr<int> p1 = make_shared<int>(10); shared_ptr<int> p2 = p1; // 计数=2

优点:共享管理,缺点:循环引用会导致永远不释放 → 内存泄漏

std::weak_ptr (弱引用)

专门解决:shared_ptr 循环引用问题

  • 不增加引用计数
  • 不拥有对象,只 “观测” 对象
  • 可以判断对象是否存活

解决循环引用:

A 引用 B,B 引用 A → 计数永远不为 0

把其中一个改成 weak_ptr → 问题解决。

shared_ptr 线程安全吗?

  • 引用计数增减是原子操作,线程安全
  • 对象本身读写不安全
  • 2.map 的底层原理是什么,与unorder_map的区别?

    一、map 的底层原理

    map 底层 = 红黑树(Red-Black Tree)

    核心特点

    1. 红黑树是一种自平衡的二叉搜索树
    2. key 会自动排序(默认升序)
    3. 插入 / 删除 / 查找 时间复杂度 O (log n)
    4. 中序遍历是有序序列
    5. 不允许 key 重复
    6. 查找速度O(log n),插入 / 删除O(log n)。

    二、unordered_map 底层原理

    unordered_map 底层 = 哈希表(Hash Table)

    核心特点

    1. 使用 哈希函数 计算 key 位置
    2. key 无序
    3. 查找 / 插入 平均 O (1),最坏 O (n)(哈希冲突)
    4. 内存占用比 map 大
    5. 迭代顺序不确定
    6. 查找速度O(1),插入 / 删除O(1)。

    要key有序用 map,要快用 unordered_map。

    3.调试sql的工具是什么,如何看索引失效?

    EXPLAIN ,例如 EXPLAIN SELECT * FROM 表 WHERE 条件;

    只看 2 个字段:key与type 。

  • key = NULL → 索引失效!没走索引!
  • key = 索引名 → 索引有效!
  • type = ALL → 全表扫描 → 索引失效!
  • type = ref /range → 索引正常使用!
  • 4.InnoDB的底层原理是什么?

    聚簇索引(Clustered Index)+ B+ 树。

  • 数据和索引存在一起(叶子节点存整行数据)
  • 主键索引是聚簇索引
  • 二级索引叶子节点只存主键
  • 所有表默认都是 B+ 树组织
  • 5.为什么使用B+树

  • 树层级低、矮胖,减少磁盘 IO(最核心)
  • 叶子节点链表相连,范围查询、排序极快
  • 非叶子节点不存数据,内存命中率更高,查询更快
  • 6.用过STL吗,STL里的lsit与vector有什么区别?

    1. vector:是连续存储的动态数组,随机访问极快,命中率高,速度通常远快于list。
    2. list:是双向链表,适合经常在中间增删的情况。
    全部评论

    相关推荐

    AI&nbsp;Coding&nbsp;相关1.&nbsp;AI&nbsp;Coding&nbsp;使用过哪些模型?2.&nbsp;DeepSeek&nbsp;和&nbsp;GPT&nbsp;的区别?3.&nbsp;你的&nbsp;AI&nbsp;Coding&nbsp;工作流是什么?4.&nbsp;如何验证&nbsp;AI&nbsp;生成代码的正确性?5.&nbsp;是否使用&nbsp;AI&nbsp;自动测试?C++&nbsp;基础指针与引用6.指针和引用的区别?7.&nbsp;项目中什么时候使用引用?nullptr8.&nbsp;nullptr&nbsp;和&nbsp;NULL&nbsp;的区别?野指针9.&nbsp;什么是野指针?10.&nbsp;野指针产生原因?11.&nbsp;如何避免野指针?RAII12.&nbsp;什么是&nbsp;RAII?13.&nbsp;项目中如何体现&nbsp;RAII?14.&nbsp;构造函数抛异常如何避免资源泄漏?智能指针15.&nbsp;shared_ptr&nbsp;原理是什么?16.&nbsp;shared_ptr&nbsp;的控制块(Control&nbsp;Block)包含什么?17.&nbsp;shared_ptr&nbsp;如何管理引用计数?18.&nbsp;什么是循环引用?19.&nbsp;weak_ptr&nbsp;的作用是什么?20.&nbsp;weak_ptr&nbsp;如何解决循环引用?21.&nbsp;weak_ptr::lock()&nbsp;做了什么?22.&nbsp;lock()&nbsp;后引用计数会增加吗?23.&nbsp;shared_ptr&nbsp;是否线程安全?24.&nbsp;shared_ptr&nbsp;在多线程下有哪些风险?25.&nbsp;项目中是否使用&nbsp;unique_ptr?26.&nbsp;unique_ptr&nbsp;和&nbsp;shared_ptr&nbsp;区别?27.&nbsp;unique_ptr&nbsp;为什么不能拷贝?28.&nbsp;unique_ptr&nbsp;为什么能移动?移动语义29.&nbsp;std::move&nbsp;本质是什么?30.&nbsp;std::move&nbsp;是否真正移动对象?31.&nbsp;为什么移动构造函数通常加&nbsp;noexcept?32.&nbsp;被&nbsp;move&nbsp;后的对象还能用吗?33.&nbsp;move&nbsp;后对象处于什么状态?STLvector34.&nbsp;vector&nbsp;底层结构是什么?35.&nbsp;vector&nbsp;为什么随机访问快?36.&nbsp;vector&nbsp;什么情况下扩容?37.&nbsp;vector&nbsp;如何扩容?38.&nbsp;vector&nbsp;扩容流程?39.&nbsp;vector&nbsp;扩容时什么时候移动?40.&nbsp;vector&nbsp;扩容时什么时候拷贝?41.&nbsp;为什么&nbsp;noexcept&nbsp;会影响&nbsp;vector&nbsp;扩容?map42.&nbsp;map&nbsp;底层数据结构?43.&nbsp;unordered_map&nbsp;底层数据结构?44.&nbsp;map&nbsp;和&nbsp;unordered_map&nbsp;区别?45.&nbsp;unordered_map&nbsp;如何处理哈希冲突?46.&nbsp;什么是拉链法?47.&nbsp;unordered_map&nbsp;一定比&nbsp;map&nbsp;快吗?48.&nbsp;unordered_map&nbsp;什么时候会退化?49.&nbsp;rehash&nbsp;的代价是什么?面向对象50.&nbsp;虚函数如何实现多态?51.&nbsp;什么是动态绑定?52.&nbsp;什么是虚函数表(vtable)?53.&nbsp;什么是虚函数指针(vptr)?54.&nbsp;为什么基类析构函数必须是虚函数?55.&nbsp;基类析构函数不是虚函数会发生什么?56.&nbsp;对象构造顺序是什么?57.&nbsp;对象析构顺序是什么?58.&nbsp;成员变量构造顺序是什么?59.&nbsp;成员变量析构顺序是什么?60.&nbsp;成员变量初始化顺序由什么决定?61.&nbsp;构造函数中能否调用虚函数?62.&nbsp;为什么构造函数中调用虚函数不会发生多态?多线程63.&nbsp;项目中哪些模块使用了多线程?64.&nbsp;AI&nbsp;视频问答为什么要使用多线程?65.&nbsp;Qt&nbsp;中如何实现异步网络请求?66.&nbsp;Qt&nbsp;信号槽跨线程通信原理?67.&nbsp;UI&nbsp;为什么必须在主线程更新?68.&nbsp;多线程如何保证线程安全?69.&nbsp;多线程同时修改变量怎么办?70.&nbsp;什么是临界区?71.&nbsp;什么是数据竞争(Data&nbsp;Race)?72.&nbsp;std::mutex&nbsp;如何使用?73.&nbsp;QMutex&nbsp;如何使用?74.&nbsp;lock_guard&nbsp;如何使用?75.&nbsp;unique_lock&nbsp;如何使用?76.&nbsp;Qt&nbsp;信号槽和&nbsp;mutex&nbsp;有什么区别?计算机网络77.&nbsp;TCP&nbsp;三次握手过程?78.&nbsp;为什么是三次握手?79.&nbsp;两次握手为什么不行?80.&nbsp;TCP&nbsp;如何保证可靠传输?81.&nbsp;TCP&nbsp;序列号作用?82.&nbsp;TCP&nbsp;ACK&nbsp;机制?83.&nbsp;TCP&nbsp;重传机制?84.&nbsp;TCP&nbsp;流量控制?85.&nbsp;TCP&nbsp;拥塞控制?86.&nbsp;TCP&nbsp;和&nbsp;UDP&nbsp;区别?HTTP87.&nbsp;HTTP&nbsp;请求结构?88.&nbsp;HTTP&nbsp;响应结构?89.&nbsp;请求行包含什么?90.&nbsp;请求头包含什么?91.&nbsp;请求体包含什么?92.&nbsp;状态行包含什么?93.&nbsp;响应头包含什么?94.&nbsp;响应体包含什么?95.&nbsp;项目中的网络请求如何封装?算法题无重复字符的最长字串(LeetCode&nbsp;3)----------------------------------------总结:整体面试体验非常好,具体拷打项目的部分没写在里面,但面试官整个过程中都是很温和,我有回答不上的问题面试官也在耐心的引导我。最后还给我的项目提出了未来的修改意见。
    点赞 评论 收藏
    分享
    5.12笔试,408基础+C/C++基础5.19&nbsp;14:00一面(技术+hr)&nbsp;50min1、自我介绍2、项目拷打3、C++三大特性4、C++虚函数相关5、全局变量能定义在多个文件中吗,有什么问题6、extern关键字7、static关键字8、const关键字9、熟悉哪些设计模式10、还知道哪些设计模式,工厂模式熟悉吗11、指针和引用12、C++新特性13、C++动态内存管理知识14、hr常规问题15、反问面试完2小时约二面5.22&nbsp;14:00二面(技术)&nbsp;35min1、自我介绍(第一次面试官自我介绍)2、让你设计一个学生信息管理系统,你会怎么设计3、全部围绕这个设计展开(用到了C++哪些特性,基类如何设计,排序算法,线程池之类问题,少部分八股+一些具体实现)(25min左右)4、你在找工作的过程中你认为学校学习的知识和实际需要的知识有什么区别5、你平常会看技术类的一些书吗,例如哪些?6、你熟悉linux吗7、如果加班严重,周末可能需要你来一天甚至俩天,能接受吗8、看你意向是南京,能接受武汉吗?9、反问5.25未收到信息,催hr,回复业务在出差,面试结果要在周三左右出来5.29未收到信息,催hr,回复组织架构调整,岗位需求暂停,感觉就是不想要我了面试感受:俩场面试三个面试官均不开摄像头,整体面试难度中下,面试官也很好,不压力,唯一离谱的是一直在换hr加微信和你对接&nbsp;。感觉没工作了,准备改改简历投到6月底,然后准备二战了
    查看20道真题和解析
    点赞 评论 收藏
    分享
    评论
    4
    7
    分享

    创作者周榜

    更多
    牛客网
    牛客网在线编程
    牛客网题解
    牛客企业服务