腾讯WXG 客户端开发-C++ 一面

1. 自我介绍

2. 实习项目拷打

3. shared_ptr 性能优于 unique_ptr 吗,为什么

答案:一般来说不能这么说,绝大多数场景下 unique_ptrshared_ptr 更轻量。unique_ptr 只有独占所有权,不需要维护引用计数,大小通常就是一个裸指针,移动也只是转移所有权。shared_ptr 需要额外的控制块来维护强引用和弱引用计数,多线程下还涉及原子操作,所以构造、拷贝、销毁成本都更高。只有在确实需要共享所有权的时候,shared_ptr 才有意义,而不是因为它“更高级”就优先使用。如果面试官继续追问,通常会往控制块、循环引用和 make_shared 上延伸。

4. make_shared 和直接 new 再构造 shared_ptr 有什么区别

答案:make_shared<T>() 一般会把对象本体和控制块放在一次内存分配里完成,分配次数更少,局部性更好,也更不容易因为中间步骤异常导致资源泄漏。而 shared_ptr<T>(new T(...)) 通常至少涉及对象本体和控制块两次分配。但 make_shared 也不是所有场景都适合,比如如果对象很大,而又有很多 weak_ptr 长时间存在,那么对象本体虽然已经析构,控制块还在,整体内存回收时机会更靠后。所以这题真正要答的是原理差异,而不是死记“哪个更好”。

代码:

#include <memory>
using namespace std;

struct A {
    int x;
    A(int v) : x(v) {}
};

int main() {
    auto p1 = make_shared<A>(10);
    shared_ptr<A> p2(new A(20));
    return 0;
}

5. unique_ptr 怎么在线程池里传参,有什么问题,可以怎么解决

答案:unique_ptr 不能拷贝,只能移动,所以如果要把它交给线程池任务,通常要通过移动语义把所有权转移到任务对象里。问题主要出在两个地方,一个是很多线程池接口早期写法会假设任务参数都能拷贝,这时候 unique_ptr 直接传会编译不过;另一个是如果异步任务执行时机不确定,就要非常清楚资源所有权已经不在原线程手里,不能再继续访问。比较常见的处理方式是用 std::moveunique_ptr 捕获到 lambda 里,或者让线程池支持完美转发,把任务参数原样转进工作队列。如果资源本来就需要跨多个任务共享,那就不该硬用 unique_ptr,而要重新设计所有权模型。

代码:

#include <iostream>
#include <memory>
#include <thread>
using namespace std;

int main() {
    unique_ptr<int> p = make_unique<int>(42);

    thread t([ptr = std::move(p)]() mutable {
        cout << *ptr << endl;
    });

    t.join();
    return 0;
}

6. shared_ptr 的控制块里一般有什么

答案:控制块一般会保存强引用计数、弱引用计数、删除器、分配器,有些实现还会带类型擦除后的销毁逻辑。多个 shared_ptr 指向同一对象时,共享的是这个控制块,而不是彼此复制一份状态。当强引用计数减到 0 时,对象本体被释放;当强弱引用都减到 0 时,控制块自身才会被释放。如果答得再深入一点,还可以讲 enable_shared_from_this 为什么必须和同一控制块关联,否则会出未定义行为。

7. C++ 新特性你常用哪些,STL 用过哪些

答案:常用的新特性一般有 auto、范围 for、右值引用、移动语义、nullptrlambdathreadmutexcondition_variableatomicunique_ptrshared_ptrunordered_mapconstexpr。STL 里常用的容器主要是 vectordequelistmapunordered_mapsetpriority_queue,算法里常用 sortfindlower_boundbinary_search。面试里这题最好不要报菜名式回答,通常挑几个自己真正用得多的展开,比如为什么 vector 常用、unordered_map 什么时候比 map 更合适、emplace_backpush_back 的差别。

8. lambda 和仿函数有什么区别

答案:lambda 本质上会被编译器生成一个匿名的闭包类型,对捕获的外部变量作为成员保存,再重载 operator()。仿函数则是开发者手写的一个类或结构体,同样通过重载 operator() 来表现得像函数。所以从本质上讲,lambda 可以看成是一种编译器帮你生成的仿函数,只不过语法更轻便,更适合局部短逻辑。如果需要复用、需要显式命名类型、需要模板参数化或者更复杂的状态管理,仿函数会更合适;如果只是回调、谓词、局部处理逻辑,lambda 更方便。

代码:

#include <iostream>
using namespace std;

struct Add {
    int operator()(int a, int b) const {
        return a + b;
    }
};

int main() {
    auto lam = [](int a, int b) { return a + b; };
    Add add;
    cout << lam(1, 2) << endl;
    cout << add(3, 4) << endl;
    return 0;
}

9. lambda 捕获 [=][&][this] 时要注意什么

答案:这题在客户端和异步代码里很常见。[=] 是值捕获,默认把用到的外部变量拷贝进闭包对象;[&] 是引用捕获,闭包里保存的是外部变量引用;[this] 则是捕获当前对象指针。真正危险的地方在于异步执行场景,比如把 lambda 投递到线程池、定时器或者 Qt 事件循环里,如果你捕获的是引用或 this,而执行时原对象已经析构,就很容易出现悬空引用。所以这题回答最好带上生命周期意识,特别是在 UI 编程和多线程场景里。

10. Qt 信号槽机制底层怎么实现

答案:Qt 的信号槽依赖元对象系统。类里加了 Q_OBJECT之后,MOC 会生成额外代码,把

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论
可以的呢,很好
点赞 回复 分享
发布于 04-19 23:16 北京
可以的,写的很好呢
点赞 回复 分享
发布于 04-19 23:03 北京

相关推荐

05-25 11:12
已编辑
中国海洋大学 C++
bg:双非本984.5硕c++岗位:客户端开发(后端挂完两次后转战客户端)5.20一面:上来给半小时时间写两道算法(客户端也要写这么多算法??):1.LRU:写get和put操作。鼠鼠我忘了迭代器怎么写了,加上没时间了然后写了个o(n)解法,最后回答有没有更好的解法解释了下正解。2.计算a+b:但只能用位运算。鼠鼠用最笨的方法将数字拆成数组然后依次判断,完全不知道可以用循环异或解QAQ。最后提问如何计算负数的时候炸了(没答出来*1)然后就是八股:1.虚函数是做什么用的?虚函数是每个类有一个还是每个对象有一个?虚析构函数作用?2.Lambda捕获机制?中括号里面的&amp;和=是什么作用?3.智能指针有什么?解释每个作用?描述shared_ptr底层逻辑?4.为什么说tcp可靠,udp不可靠?http内部怎么实现请求和回包的?(没答出来*2)(他直接打断我吟唱三次握手说是http不是tcp,没理解想问什么http协议有什么字段?5.事务四个特性?解释每个特性。之后就是项目拷打,我用qt写了个小游戏带个私货:觉得我的文章对你有用请在github点个star谢谢喵【演示视频:https://www.bilibili.com/video/BV15nXCBVEp5/?spm_id_from=333.1387.homepage.video_card.click&amp;vd_source=6d58f9d1e033f108043d07da57ce4bca】【GitHub:https://github.com/zhongzhounb/Machi_Koro_AI】6.了解信号槽机制吗?你了解信号槽底层机制吗?(没答出来*3)(不太熟练,我回答Call&nbsp;back模式不知道是否正确信号槽用了哪种设计模式呢?(没答出来*4)(真不知道了,难道信号槽不就是一个设计模式?7.了解句柄吗?什么类型可以设成句柄?8.消息循环机制了解吗?怎么工作的?qt事件分发机制?(没答出来*5)(我说是通过id过滤不知道是否正确9.客户端与服务端怎么交互的?如果断线会补重吗?(没答出来*6)(不知道什么是补重,他问断线重连我就回答出来了QAQ之后主动提出演示下我的项目以提高略微的通过率。10.前端效果还可以,素材是怎么来的(复杂图片素材通过扫描实体卡牌+ai抠图+古法补色,简单图片靠ai生产,视频靠文字生图+图生视频)11.项目难点(我回答了前端自适应以及后端卡牌命令堆叠,具体可以看我的readme12.前端代码怎么写的(我最怕问的问题,我实际的操作是:先写后端暴露前端接口,然后vibe&nbsp;coding前端再人工调参。我就这样回答的,就怕他问第13个问题13.那就是前端都是用ai写的咯?(这我真不知道怎么回答了,说是说明不会前端技术,说不用ai又是与时代脱节,有牛友知道怎么回答好吗QAQ反问环节:1.如果来贵公司实习,我需要做什么工作?(感觉这个都得问,不然面试官觉得意向不大,至少我是这么认为的2.我回答的怎么样,可否给我个建议?(一搬公司要求不会给,但给了就血赚,对复盘有很大帮助3.就您个人而言,您更看中应聘者的什么能力(拿笔记本记一下,迭代进化自我面试个性5.25感谢信:又是挂的不明不白的一天
点赞 评论 收藏
分享
评论
2
9
分享

创作者周榜

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