番茄小说-客户端开发-一面
1. C++中智能指针有哪几种?各自的使用场景是什么?
答案:
- unique_ptr: 独占所有权,不可拷贝,只能移动适合明确单一所有者的场景零开销,性能等同于裸指针可以自定义删除器
- shared_ptr: 共享所有权,引用计数管理最后一个shared_ptr销毁时释放资源有额外开销(控制块、原子操作)适合多个对象共享资源的场景
- weak_ptr: 弱引用,不增加引用计数需要配合shared_ptr使用可以判断对象是否还存活(expired())通过lock()获取shared_ptr
- 使用建议:优先unique_ptr,需要共享时用shared_ptr
2. weak_ptr是如何解决shared_ptr循环引用问题的?
答案:
- 循环引用问题: 对象A持有shared_ptr<B>,对象B持有shared_ptr<A>两者引用计数都不为0,永远不会释放导致内存泄漏
- weak_ptr解决方案: 将其中一个改为weak_ptr,不增加引用计数例如:父节点持有shared_ptr<子节点>,子节点持有weak_ptr<父节点>父节点销毁时,子节点的weak_ptr不会阻止释放
- 使用示例: 观察者模式:被观察者持有weak_ptr<观察者>缓存系统:缓存持有weak_ptr,不影响对象生命周期树形结构:子节点持有父节点的weak_ptr
3. Qt的对象树内存管理机制是如何工作的?
答案:
- 父子关系: QObject派生类可以指定父对象父对象销毁时自动销毁所有子对象子对象添加到父对象的children列表
- 内存管理: 不需要手动delete子对象父对象析构时遍历children列表,delete所有子对象避免内存泄漏和悬空指针
- 使用场景: UI控件:窗口作为父对象,控件作为子对象资源管理:将相关对象组织成树形结构
- 注意事项: 栈上对象不要设置父对象(会被delete两次)跨线程对象要小心父子关系可以用deleteLater()延迟删除
4. QML是什么?它与传统Qt Widgets有什么区别?
答案:
- QML定义: Qt Meta Language,声明式UI语言基于JavaScript,类似JSON语法用于快速构建流畅的用户界面
- 与Widgets区别: Widgets:命令式,C++代码创建UI,传统桌面风格QML:声明式,描述UI结构和行为,现代化界面
- QML优势: 开发效率高,UI和逻辑分离动画和过渡效果简单支持触摸、手势,适合移动端热重载,实时预览
- 技术栈: QML负责界面C++负责业务逻辑通过Q_PROPERTY、Q_INVOKABLE交互
5. 浏览器从输入URL到页面展示的完整过程是什么?
答案:
- DNS解析: 浏览器缓存 → 系统缓存 → 路由器缓存 → ISP DNS服务器递归查询获取IP地址
- TCP连接: 三次握手建立连接HTTPS需要TLS握手
- 发送HTTP请求: 构造请求报文(请求行、请求头、请求体)发送到服务器
- 服务器处理: 解析请求,执行业务逻辑返回HTTP响应(状态码、响应头、响应体)
- 浏览器渲染: 解析HTML构建DOM树解析CSS构建CSSOM树合并生成渲染树(Render Tree)布局(Layout):计算元素位置和大小绘制(Paint):绘制像素到屏幕合成(Composite):GPU加速合成图层
- 资源加载: 并行下载CSS、JS、图片等资源JS执行可能阻塞渲染
6. HTTP的GET和POST请求有什么本质区别?
答案:
- 语义区别: GET:获取资源,幂等操作,可缓存POST:提交数据,非幂等,修改服务器状态
- 参数传递: GET:参数在URL中,有长度限制(浏览器限制,非协议限制)POST:参数在请求体中,无长度限制
- 安全性: GET:参数暴露在URL,会被记录在日志、历史记录POST:参数在请求体,相对安全(但仍需HTTPS加密)
- 缓存: GET:可以被浏览器缓存、CDN缓存POST:默认不缓存
- 幂等性: GET:多次请求结果相同POST:多次请求可能产生不同结果(如重复提交订单)
- 实际应用: GET:查询、搜索、分页POST:登录、注册、提交表单
7. 根据HTTP请求类型可以做哪些性能优化?
答案:
- GET请求优化: 浏览器缓存:设置Cache-Control、ETagCDN缓存:静态资源
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。