当前位置: 首页 > article >正文

C#中面试的常见问题008

1.内存泄露

内存泄露的原因:

  1. 未释放动态分配的内存:在使用mallocnew等动态内存分配函数后,未能正确释放内存。
  2. 引用计数错误:在引用计数管理内存的语言中,增加引用计数但未相应减少,导致内存无法释放。
  3. 循环引用:对象之间相互引用形成循环,导致引用计数永远不会为零,从而无法释放内存。
  4. 文件未关闭:打开的文件或网络连接在使用完毕后未正确关闭,导致资源泄漏。
  5. 内存碎片:频繁分配和释放小块内存可能导致内存碎片,影响程序性能。

预防内存泄露的策略:

  1. 及时释放动态内存:在使用完毕后及时释放使用mallocnew等分配的内存。
  2. 避免野指针和空指针解引用:声明指针变量时初始化为NULL,使用前进行空指针判断,使用完毕后置空。
  3. 关闭和释放资源:使用完文件、网络连接等资源后,及时关闭或释放。
  4. 使用智能指针:C++11引入的智能指针如unique_ptrshared_ptr可以自动管理内存。
  5. 使用工具进行静态分析:使用如Clang Static Analyzer、Valgrind等工具发现内存泄漏风险。

内存泄露的检测方法:

  1. 内存检测工具:使用专业的内存检测工具,如Valgrind、AddressSanitizer等,帮助检测程序中的内存泄漏问题。
  2. Valgrind:Linux下的内存泄露检测工具,可以检测未释放内存的使用、对释放后内存的读写等。
  3. LeakSanitizer:作为AddressSanitizer的一部分,可以检测出各种内存访问错误,包括内存泄漏

2.如何从粘包的数据中拿到想要的数据

1. 使用固定分隔符

在每个数据包的末尾使用固定的分隔符(如\r\n),如果一个包被拆分了,则等待下一个包发送过来之后找到其中的分隔符,然后对其拆分后的头部部分与前一个包的剩余部分进行合并,这样就得到了一个完整的包。

2. 设置包长

在消息头部设置包长,确定数据包的完整性。通过在消息头部设置包长,可以确定数据包的完整性,从而将粘包进行拆包。

3. 使用struct模块创建报头

为字节流加上自定义固定长度报头,报头中包含字节流长度,然后一次send到对端,对端在接收时,先从缓存中取出定长的报头,然后再取真实数据。

4. 自定义协议

通过自定义协议进行粘包和拆包的处理。例如,可以设计一个协议,其中包含数据包的长度、标识符等信息,这样在接收数据时可以根据这些信息来正确地拆分和组装数据包。

5. 循环处理缓冲区

将收到的数据copy到缓存区,在缓存区里循环从起始位按照协议找出完整的一包数据提取出来。关键点在于根据协议找出完整一包数据的长度。


http://www.kler.cn/a/411656.html

相关文章:

  • python3 自动更新的缓存类
  • windows安全中心,永久卸载工具分享
  • Oracle RAC的DB未随集群自动启动
  • 如何使用Postman优雅地进行接口自动加密与解密
  • Selenium 包介绍
  • C 语言学习-06【指针】
  • 列表代码思路
  • 前端技术选型之uniapp
  • MySQL中char和varchar的区别详解
  • JavaWeb——请求响应(5/8)-请求:日期参数json参数(使用场景及封装类型、接收方式、在 Postman 中传递、在服务端接收)
  • Spring框架使用xml方式配置ThreadPoolTaskExecutor线程池,并且自定义线程工厂
  • jdk17-LongAddr 类increment()方法注释说明
  • c++中的lambda表达式!
  • 【H2O2|全栈】JS进阶知识(十一)axios入门
  • ChatGPT如何辅助academic writing?
  • 学习路之linux--多php版本下指定php版本执行命令
  • 基于Java Springboot华为数码商城交易平台
  • 数据结构初阶---复杂度
  • 大模型的实践应用31-基于通义千问大模型改进台风和海浪预测研究,利用机器学习与通义千问结合的思路实现对台风和海浪预测分析
  • Mongo数据库 --- Mongo Pipeline
  • 量子安全与经典密码学:一些现实方面的讨论
  • 分布式在线评测系统
  • 【机器视觉 OCR】适合Python开发的OCR工具:深入解析与实战应用
  • Python学习34天
  • 在Unity中实现物体动画的完整流程
  • HTTP 管道传输与多路复用