动态内存管理

1.C/C++内存分布

【说明】

1.栈(堆栈)非静态局部变量,栈是向下增长的。

2.内存映射段:是高效的I/O映射方式,用于装载一个共享的的动态内存库。用户可使用系统接口创建共享内存,做进程间通信。

3.堆:用于程序运行时动态内存分配,堆可以是向上增长的。

4.数据段:储存全局数据和静态数据。

5.代码段:可执行的代码/只读常量。

2.C语言动态内存管理方式

2.1malloc calloc realloc

【面试题】

malloc/realloc/calloc的区别?

区别:1.函数名不同,参数类型不同

2.calloc会对空间进行初始化,并且会初始化为0,其他两个不会。

3.malloc申请空间必须初始化。

4.realloc对已知的空间进行调整,当第一个参数传入NULL的时候和malloc一样。realloc会在内存中开辟新的空间,将原有的值拷贝进新空间,释放旧空间。

3.C++内存管理方式

C++提供了一套功能更强大的内存管理方式:new和delete进行动态内存管理。

3.1new/delete操作内置类型

new/delete处理内置类型时,与malloc/calloc/realloc并无二异。

注意:申请和释放单个元素空间,使用newdelete操作符,申请和释放连续空间,使用new[]delete[]

3.2new和delete处理自定义类型

对于自定义类型,申请空间时new会开空间+调用构造函数初始化,delete会调用析构函数释放资源+释放空间,而malloc和free不会。

4.operator new 与operator delete 函数

4.1简介

new和delete是用户进行动态内存申请和释放的操作符,operator new和operator delete是系统提供的全局函数,new在最底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

举例:

注意:

operator new实际上也是通过malloc来申请空间,如果马路咯从申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终通过free来释放空间的。

4.2operator new和operator delete的专属重载

应用重载类专属,可以通过在内存池中申请空间来提高效率。

关于内存池:相当于自己的私房钱。随意用。

5.【面试题】malloc/free和new/delete的区别

malloc/free和new/delete的共同特点是:从堆上申请空间,并且需要用户手动释放。

区别:

1.malloc和free是函数,new和delete是操作符。

2.malloc申请空间不会初始化,new自动初始化。

3.malloc申请空间时,需要手动计算空间大小并传递,new只需要在其后跟上空间的类型即可。

4.malloc的返回值为void*,使用时必须强转,new不需要,因为new后跟的是控件类型。

5.malloc申请空间失败时,返回值是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常。

6.申请自定义类型时,malloc只会开辟空间,不会调用构造和析构函数,而new在申请空间后会调用构造函数完成对对象的初始化,delete在释放空间会调用析构函数完成空间中资源的清理。

6.内存泄漏

6.1内存泄漏概念

什么是内存泄漏:☞因为疏忽或者错误造成程序已经不再使用使用内存的情况,内存泄露并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为错误,失去了对该段内存的掌控,因而造成了内存的浪费。

危害:长期运行的程序出现内存泄漏,影响很大。出现内存泄漏会导致相应越来越慢,最终卡死。

6.2内存泄漏分类

1.堆内存泄露

堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存,

用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放,那

么以后这部分空间将无法再被使用,就会产生Heap Leak。

2.系统资源泄露

指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统 资源的浪费,严重可导致系统效能减少,系统执行不稳定。

6.3如何避免

1. 工程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配的去释放。ps:这个理想状

态。但是如果碰上异常时,就算注意释放了,还是可能会出问题。需要下一条智能指针来管理才有保

证。

2. 采用RAII思想或者智能指针来管理资源。

3. 有些公司内部规范使用内部实现的私有内存管理库。这套库自带内存泄漏检测的功能选项。

4. 出问题了使用内存泄漏工具检测。ps:不过很多工具都不够靠谱,或者收费昂贵。

总结一下:

内存泄漏非常常见,解决方案分为两种:1、事前预防型。如智能指针等。2、事后查错型。如泄漏检测工具。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输单元(MTU)/路径MTU 以太网帧格式 ICMP ARP RARP 03TCPIP基础(三) IP数据报格式 网际校验和 路由 04TCPIP基础(四) TCP特点 TCP报文格式 连接建立三次握手 连接终止四次握手 TCP如何保证可靠性 05TCPIP基础(五) 滑动窗口协议 UDP特点 UDP报文格式 Linux网络编程之socket编程篇 06socket编程(一) 什么是socket IPv4套接口地址结构 网络字节序 字节序转换函数 地址转换函数 套接字类型 07socket编程(二) TCP客户/服务器模型 回射客户/服务器 socket、bind、listen、accept、connect 08socket编程(三) SO_REUSEADDR 处理多客户连接(process-per-conection) 点对点聊天程序实现 09socket编程(四) 流协议与粘包 粘包产生的原因 粘包处理方案 readn writen 回射客户/服务器 10socket编程(五) read、write与recv、send readline实现 用readline实现回射客户/服务器 getsockname、getpeername gethostname、gethostbyname、gethostbyaddr 11socket编程(六) TCP回射客户/服务器 TCP是个流协议 僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14socket编程(九) select 读、写、异常事件发生条件 用select改进回射服务器程序。 15socket编程(十) 用select改进第八章点对点聊天程序 16socket编程(十一) 套接字I/O超时设置方法 用select实现超时 read_timeout函数封装 write_timeout函数封装 accept_timeout函数封装 connect_timeout函数封装 17socket编程(十二) select限制 poll 18socket编程(十三) epoll使用 epoll与select、poll区别 epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射客户/服务 UNIX域套接字编程注意点 22socket编程(十七) socketpair sendmsg/recvmsg UNIX域套接字传递描述符字 Linux网络编程之进程间通信篇 23进程间通信介绍(一) 进程同步与进程互斥 进程间通信目的 进程间通信发展 进程间通信分类 进程间共享信息的三种方式 IPC对象的持续性 24进程间通信介绍(二) 死锁 信号量 PV原语 用PV原语解决司机与售票员问题 用PV原语解决民航售票问题 用PV原语解决汽车租赁问题 25System V消息队列(一) 消息队列 IPC对象数据结构 消息队列结构 消息队列在内核中的表示 消息队列函数 26System V消息队列(二) msgsnd函数 msgrcv函数 27System V消息队列(三) 消息队列实现回射客户/服务器 28共享内存介绍 共享内存 共享内存示意图 管道、消息队列与共享内存传递数据对比 mmap函数 munmap函数 msync函数 29System V共享内存 共享内存数据结构 共享内存函数 共享内存示例 30System V信号量(一) 信号量 信号量集结构 信号量集函数 信号量示例 31System V信号量(二) 用信号量实现进程互斥示例 32System V信号量(三) 用信号集解决哲学家就餐问题 33System V共享内存与信号量综合 用信号量解决生产者消费者问题 实现shmfifo 34POSIX消息队列 POSIX消息队列相关函数 POSIX消息队列示例 35POSIX共享内存 POSIX共享内存相关函数 POSIX共享内存示例 Linux网络编程之线程篇 36线程介绍 什么是线程 进程与线程 线程优缺点 线程模型 N:1用户线程模型 1:1核心线程模型 N:M混合线程模型 37POSIX线程(一) POSIX线程库相关函数 用线程实现回射客户/服务器 38POSIX线程(二) 线程属性 线程特定数据 39POSIX信号量与互斥锁 POSIX信号量相关函数 POSIX互斥锁相关函数 生产者消费者问题 自旋锁与读写锁介绍 40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值