腾讯 PC客⼾端-C++ ⼀⾯

1. 自我介绍

2. C++ 中的智能指针都有哪些,分别解决什么问题

答案:常见的智能指针主要是 unique_ptrshared_ptrweak_ptr,另外还有早期遗留的 auto_ptr,但它已经被废弃。unique_ptr 表示独占所有权,同一时刻只有一个指针拥有对象,不能拷贝只能移动,开销小,最适合所有权明确的场景。shared_ptr 表示共享所有权,多个对象都可以持有同一资源,底层通常有引用计数和控制块,适合多个模块共同管理一个对象的场景。weak_ptr 不拥有对象,只是观察者,通常用来打破 shared_ptr 循环引用,或者在不延长对象生命周期的前提下探测对象是否还活着。工程里不是“智能指针越多越好”,而是先明确所有权。如果生命周期天然受作用域控制,栈对象往往更简单;如果资源归属唯一,优先 unique_ptr;只有真正需要共享时才考虑 shared_ptr

代码:

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

struct Node {
    int val;
    Node(int x) : val(x) { cout << "ctor\n"; }
    ~Node() { cout << "dtor\n"; }
};

int main() {
    unique_ptr<Node> p1 = make_unique<Node>(1);
    shared_ptr<Node> p2 = make_shared<Node>(2);
    weak_ptr<Node> p3 = p2;
    return 0;
}

3. shared_ptr 为什么会有额外开销,循环引用怎么解决

答案:shared_ptr 的额外开销主要来自两个地方,一个是控制块,里面通常存引用计数、弱引用计数、删除器等信息;另一个是引用计数的修改在多线程场景下往往涉及原子操作。所以它的价值不在于快,而在于共享所有权时能减少手动生命周期管理错误。循环引用最典型的场景是双向关系,比如 A 持有 B,B 又持有 A,如果双方都用 shared_ptr,引用计数永远不会归零,内存就泄漏了。常见做法是一边保留 shared_ptr,另一边改成 weak_ptr,这样既能访问,又不会把生命周期锁死。

代码:

#include <memory>
using namespace std;

struct B;
struct A {
    shared_ptr<B> b;
};

struct B {
    weak_ptr<A> a;   // 这里不能再用 shared_ptr
};

int main() {
    auto pa = make_shared<A>();
    auto pb = make_shared<B>();
    pa->b = pb;
    pb->a = pa;
    return 0;
}

4. 为什么要做内存对齐

答案:内存对齐主要是为了让 CPU 更高效地访问数据。很多硬件架构更适合按自然边界访问,比如 4 字节整数按 4 字节对齐、8 字节类型按 8 字节对齐。如果对象地址不对齐,轻则访问变慢,重则某些平台直接触发硬件异常。编译器做对齐还有一个重要原因是简化访存逻辑和提高总线利用率。对齐后,CPU 往往能在更少的访存次数里取到完整数据。从 C++ 对象布局看,对齐还会引入 padding,所以成员顺序会影响结构体大小。工程里如果对象数量很大,成员顺序优化有时能明显减少内存占用。

代码:

#include <iostream>
using namespace std;

struct A {
    char c;
    int i;
    short s;
};

struct B {
    int i;
    short s;
    char c;
};

int main() {
    cout << sizeof(A) << endl;
    cout << sizeof(B) << endl;
    return 0;
}

5. malloc、calloc、realloc 有什么区别

答案:malloc 负责申请指定字节数的原始内存,申请成功后内容未初始化。calloc 申请的是若干个同样大小的对象,总大小等于两者乘积,而且会把整块内存置零。realloc 用来调整一块已经分配内存的大小,可能原地扩容,也可能重新申请一块更大的内存并把原数据拷过去。它们都只是 C 语言层面的内存管理接口,不会调用构造函数和析构函数,所以管理 C++ 对象时通常不如 new/delete 或 RAII 安全。

代码:

#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;

int main() {
    int* a = (int*)malloc(5 * sizeof(int));
    int* b = (int*)calloc(5, sizeof(int));
    a = (int*)realloc(a, 10 * sizeof(int));

    free(a);
    free(b);
    return 0;
}

6. new/de

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

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

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

全部评论

相关推荐

昨天 01:10
已编辑
合肥大学 游戏前端
截止至3.20腾讯,投不了😭😭😭网易雷火3.21约笔,感觉多半寄,算法没咋复习来着;互娱,了无音讯😡字节客户端开发,约了3.25的三面,一面手撕写的一坨,八股没复习到位,依旧让我过了,感动😭。二面拷打的极其详细,沿着简历一条条问下来,有的地方我都我考虑到淦,收获很多。心动引擎开发,约了3.23的二面(hr说是终面,感觉是因为一面直接是两个面试官问我的淦,一个问了一堆渲染,一个考察了八股、实习、项目),前一个面试官狠狠问了我一堆路径追踪和brdf,后面转问物理倒是能扯上一点了。面试官人都很好,回答的事项都详细解释说明了,周末再多看看渲染。也让我物理有更多理解了。今天正好之前引擎课题上了一节,感觉有不少新的理解😇,二面再聊聊去。米哈游客户端,约了3.24的线下面(说是二面起步,流程顺利直接结束),祈祷🙏🏻,但算法手撕真感觉不太行。莉莉丝、叠纸、鹰角,简历挂。柠檬微趣客户端,笔试挂,算法基本没复习多少&nbsp;叹气。之前还面了个物理引擎中厂引擎开发,一面速通,但给的太低,机器人方向,其实有点有趣感觉,但是日薪太低了。ea中国客户端,约了下周末的笔试,不过它家时间好像是真7、8月份的暑假实习....其他一堆中厂好像还没怎么投。等这边三个流程吧。感觉可能也不走,现在腾讯其实也有hc,转房子好麻烦&nbsp;叹气。但还是祈祷米哈游能过🙏🏻以及好忙.....周一周二周三三天又给我挤满了😭😭😭
游戏求职进展汇总
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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