固生堂面试(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(最核心)
  • 叶子节点链表相连,范围查询、排序极快
  • 非叶子节点不存数据,内存命中率更高,查询更快
  • 太晚了,没写完,明天继续... ...

    全部评论

    相关推荐

    不愿透露姓名的神秘牛友
    今天 10:32
    26届,双非本,还有20多天就要毕业了,我现在&nbsp;0&nbsp;offer。感觉自己的人生要完蛋了。。。但是又能怪谁,全都是我自己作的。我有罪、对不起面试被我放鸽子的面试官。面试定的早上9点,结果我定错了闹钟定成了第二天的早上9点,等我睡醒的时候已经是快10点了。。。。我有罪、对不起帮助我的学长,秋招的时候有个学长帮我看简历、还内推我了一家还不错的大厂,但岗位不是太合适。我听说大厂都会看面评,我怕表现不好脏面评,就不敢面了,然后那场面试就鸽了。学长后来问我,我撒谎说自己生病了。。我有罪、对不起支持我的女朋友!!她之前家里一堆事情,爸爸生病了,她请假回家了几天,又立马回来陪我,陪我去双选会、看到好的招聘机会都会发给我,我自己心态不好,经常不回信息、冲她发脾气。有天晚上我发神经迁怒她,讲了非常难听的话,她什么都没说,只让我早点休息,她一直都在包容我。。。我有罪,秋招本来有个小厂offer,但当时拒掉了。主要是觉得春招能找到更好的,结果现在春招没offer了,前天问hr想舔回来,人家已经招到人了。。。我对不起父母、我该死!!我爸妈到现在还以为我"在面试阶段"。我妈上周打电话还说"不着急,慢慢挑"。我挂了电话哭了半小时。我不是在挑,妈,我是真的没有人要。&nbsp;但我是真的不知道接下来该怎么办了。秋招春招全寄了、应届身份马上就没了。我就是欠骂!我就是该死!牛爷爷们,我还有救吗?
    温昂:前面都觉得没啥,看到女朋友就怒了,兄弟罪大恶极啊!!谈不明白就别谈,留给会谈的
    点赞 评论 收藏
    分享
    评论
    点赞
    收藏
    分享

    创作者周榜

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