【车企大厂面试题】理想汽车(C++一面)后端校招最新面试题

目录

C++11 新特性了解哪些内容?

智能指针介绍一下?

shared_ptr的作用是什么?

weak_ptr的作用是什么?如何和shared_ptr结合使用?

lambda表达式的原理是什么?

stl迭代器的失效情况你知道哪些?

unordered_map的底层结构是什么?

linux程序崩溃怎么定位问题?

linux的内存是如何组织的?

你说到缺页中断,能介绍一下缺页中断么?

对于缺页中断这种情况,linux操作系统是如何减少页面的换入换出的呢,有哪些方式?

你了解数字证书么?

https的握手过程说一下?

对于https中的加密算法,rsa和ecc椭圆加密,这两者有什么区别么?

排序算法介绍一下?

大文件排序应该怎么办?


C++11 新特性了解哪些内容?

类型推导与简化语法

特性名称 描述 示例
auto

 关键字

自动推导变量类型,简化复杂类型声明(如迭代器)。

auto x = 42;

 → int x

decltype

推导表达式类型,保留 const 和引用属性,适用于模板编程。

int i=1; decltype(i) j = i;

 → int j

右值引用与移动语义

右值引用(&&

区分左值/右值,支持资源高效转移(如临时对象)。

std::vector<int> v2 = std::move(v1);

移动构造函数/赋值运算符

减少深拷贝开销,通过资源转移提升性能。

类中定义 ClassName(ClassName&& other) noexcept;

完美转发(std::forward

保持参数原始类型,避免多次拷贝。

模板中使用 std::forward<T>(arg)

智能指针

std::unique_ptr

独占所有权,不可复制但可移动,替代 auto_ptr

std::unique_ptr<int> ptr = std::make_unique<int>(10);
std::shared_ptr

共享所有权,引用计数管理资源,线程安全。

std::shared_ptr<int> ptr = std::make_shared<int>(10);
std::weak_ptr

解决 shared_ptr 循环引用问题。

std::weak_ptr<int> w_ptr = s_ptr;

函数与模板增强

Lambda 表达式

匿名函数,支持捕获外部变量,简化回调和算法。

std::sort(vec.begin(), vec.end(), [](int a, int b) { return a < b; });

变长参数模板

支持任意数量/类型的模板参数,用于元编程和容器设计。

template<typename... Args> void func(Args... args);
constexpr

 常量表达式

编译时求值,优化性能,允许函数在编译期执行。

constexpr int factorial(int n) { return n <=1 ? 1 : n*factorial(n-1); }

并发编程支持

std::thread

原生多线程支持,结合互斥锁和原子操作实现同步。

std::thread t(func); t.join();
std::async

 和 std::future

简化异步任务管理,获取异步操作结果。

auto future = std::async(func); int result = future.get();

智能指针介绍一下?

  • std::shared_ptr:是一种引用计数智能指针,允许多个shared_ptr对象共享同一个对象,并通过引用计数来管理内存的释放,当最后一个shared_ptr指向对象析构时,会释放对象所占用的内存。不适合处理循环引用的情况,可能导致内存泄漏。

  • std::unique_ptr:是一种独占式智能指针,确保只有一个指针可以指向一个对象,不能进行复制,但可以移动它的所有权。

  • std::weak_ptr:是用于解决std::shared_ptr可能导致的循环引用问题的智能指针。它允许引用shared_ptr所管理的对象,但不会增加引用计数,不会影响对象的生命周期,避免循环引用导致的内存泄漏。

shared_ptr的作用是什么?

在传统的 C++ 编程中,使用 new 操作符分配的内存需要手动使用 delete 操作符释放,若忘记释放或者在异常情况下无法执行 delete 操作,就会造成内存泄漏。

std::shared_ptr 可以自动处理内存的释放,当不再有 std::shared_ptr 指向该对象时,对象的内存会被自动释放。

std::shared_ptr 支持多个 std::shared_ptr 实例共享同一个对象的所有权。它通过引用计数机制来实现这一点,每个 std::shared_ptr 都会维护一个引用计数,记录有多少个 std::shared_ptr 共享同一个对象。当引用计数变为 0 时,对象的内存会被释放。

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "MyClass constructor" << std::endl; }
    ~MyClass() { std::cout << "MyClass destructor" << std::endl; }
};

int main() {
    std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
    std::shared_ptr<MyClass> ptr2 = ptr1; // 共享所有权
    std::cout << "Use count: " << ptr1.use_count() << std::endl; // 输出 2
    ptr2.reset(); // 释放 ptr2 的所有权
    std::cout << "Use count: " << ptr1.use_count() << std::endl; // 输出 1
    // 当 ptr1 离开作用域时,MyClass 对象的内存会被释放
    return0;
}

在这个例子中,ptr1 和 ptr2 共享同一个 MyClass 对象的所有权,引用计数变为 2。当调用 ptr2.reset() 时,ptr2 释放了对对象的所有权,引用计数减为 1。当 ptr1 离开作用域时,引用计数变为 0,对象的内存被释放。

weak_ptr的作用是什么?如何和shared_ptr结合使用?

std::weak_ptr 主要用于辅助 std::shared_ptr 进行内存管理,解决 std::shared_ptr 可能存在的循环引用问题,同时还可以用于观察 std::shared_ptr 所管理对象的生命周期。

当两个或多个 std::shared_ptr 相互引用形成循环时,会导致引用计数永远不会降为 0,从而造成内存泄漏。std::weak_ptr 不会增加所指向对象的引用计数,因此可以打破这种循环引用。

#include <iostream>
#include <mem
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地僧009

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值