科大讯飞C++开发一面-面经总结

1、内存泄漏和内存溢出的概念?

内存泄漏定义:内存泄漏是指程序在动态分配内存后,失去了对该内存的引用,但该内存并没有被释放。也就是说,程序无法再访问这块内存区域,导致这部分内存被"遗忘"而无法被回收。

1.new 分配内存后没有使用 delete

2.改变了指向该内存的指针,使得原指针失效

3.循环引用(在使用智能指针时,两个对象相互持有对方,导致引用计数永远不为零)

内存溢出:定义:内存溢出(或称为堆栈溢出)是指程序在运行过程中,试图使用超出其可用内存范围的内存。这通常发生在栈空间耗尽或堆空间耗尽的情况下。

1.空间耗尽(一般是递归太深了)

2.超过了分配限制

2、new的底层原理?

一块是分配内存 有可能operator new 有可能malloc:

operator new 是C++中提供的一个全局函数,用于分配指定大小的内存块。如果分配成功,operator new 返回指向这块内存的指针;如果失败,则抛出 std::bad_alloc 异常。

3、this指针的原理 如果把this delete,还能用吗,什么场景下还能用?

this 指针指向调用该成员函数的对象实例。

所有非静态成员函数都有一个 this 指针。

通过 this 指针可以访问当前对象的成员变量和成员函数。

delete this 会销毁当前对象,释放其占用的内存。

在调用 delete this 后,this 指针所指向的内存将被标记为可用,但指针仍然存在。因此,试图继续使用该指针将导致未定义行为,可能会导致程序崩溃或错误的结果。

在某些情况下,可能需要使用 delete this,例如在实现单例模式或自我管理的对象时。

确认不需要再使用就可以delete this

4、进程间的通信方式,线程间的通信方式?

管道(Pipe)

消息队列(Message Queue)

共享内存(Shared Memory)

信号(Signal)

套接字(Socket)

共享变量

条件变量(Condition Variable)

信号量(Semaphore)

消息队列(Message Queue)

事件(Event)

5、怎么避免死锁?

互斥

占有和等待

不可抢占

循环等待

--四大天王直接破坏就行了

6、四种强制类型转换?

  1. static_cast编译时类型转换
  2. dynamic_cast安全地转换指针或引用
  3. const_cast去除对象的常量性
  4. reinterpret_cast执行低级别的类型转换

7、右值引用和完美转发?

用&&表示 右值引用是C++11引入 把原本需要复制的操作变成转移

复制代码
资源管理:允许转移资源的所有权,避免不必要的复制,从而提高性能。

实现移动语义:通过移动构造函数和移动赋值运算符,能够高效地管理动态分配的资源。

std::move 将对象 a 转换为右值引用,从而调用移动构造函数,避免了复制的开销。

完美转发则是指在模板中以原始的值类别(左值或右值)转发参数,确保保持参数的值类别。它使用 std::forward 函数实现。

8、怎么利用C++新特性实现一个无锁的并发?

C++11 引入了 std::atomic,它提供了一种原子类型,可以安全地在多个线程间共享数据而不需要加锁。原子操作是不可中断的操作,保证了在多个线程同时访问时的一致性。

9、设计模式,使用单例要注意什么,双检锁是绝对安全的吗?

线程安全:如果单例实例会在多线程环境中被访问,需要确保线程安全。在 C++ 中,可以通过使用互斥锁(std::mutex)来保护实例的创建。

延迟初始化:单例的实例通常在第一次被请求时创建。要避免在多线程环境中出现多个实例,常用的策略是使用双重检查锁定(Double-Checked Locking,DCL)。

静态局部变量:在 C++11 及以上版本中,可以利用静态局部变量的初始化特性。编译器会保证静态局部变量的初始化是线程安全的。

防止拷贝和赋值:为了确保单例特性,应该禁用拷贝构造函数和赋值运算符。

全局访问点:提供一个静态方法来获取单例实例。

相关推荐
yuniko-n8 分钟前
【JUC】volatile 非原子性深入解析
java
TechWayfarer11 分钟前
PHP漏洞被利用,怎么揪出攻击IP?
开发语言·python·tcp/ip·网络安全·php
sun_weitao23 分钟前
极简版 MCP 工具实现方案
java·linux·服务器
王老师青少年编程42 分钟前
2025年6月GESP真题及题解(C++三级): 选择题和判断题(题解)
c++·真题·gesp·答案·csp·三级·信奥赛
金銀銅鐵2 小时前
[Java] 展示增删元素时 LinkedList 的内部变化
java·后端·ai编程
卡卡~~2 小时前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法
qq_406981032 小时前
大白话rust系列09 函数调用两次有什么错?
开发语言·python·rust
学逆向的2 小时前
C 多文件开发
c语言·开发语言·网络安全
布吉岛的石头2 小时前
Java 程序员第 50 阶段3:数据工程:预训练语料清洗与去重
java·开发语言·人工智能·深度学习·transformer
benchmark_cc2 小时前
QuantDash 安装成功后,如何验证 Python 环境可以正常导入 SDK?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash