【C++】内存管理

简介: 不同变量存在不同的空间中,这些空间主要分为栈,堆,数据段,代码段。


一. 全局/局部和静态/非静态类型变量的区别

20210418215549945.png


二. C/C++内存分布


不同变量存在不同的空间中,这些空间主要分为栈,堆,数据段,代码段。


栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的

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

数据段–存储全局数据和静态数据。

代码段–可执行的代码/只读常量。


2021041822035862.png


三. C/C++内存管理方式


1. C内存管理方式


PS:malloc/calloc/realloc/free都是C库函数


1.1 malloc/calloc/realloc/free的使用方法

20210418222316882.png



2.1 malloc/calloc/realloc使用效果的区别


malloc:只是单纯的开辟空间。

calloc:开辟空间后,把空间内容一个字节一个字节的初始化为0

realloc:如果后面空间足够,在原有的空间上进行扩容;后面空间不够的话拷贝原空间的数据到新扩容的另一块空间上,并自动释放原空间。

2. C++内存管理方式

PS:new/delete是操作符


C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。


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

20210418224155102.png


四. operator new与operator delete函数

PS:operator new 和operator delete是系统提供的全局函数。


1. operator new


1.1 概念


底层还是以依靠malloc函数实现开辟空间,只不过增加了开辟空间失败后的抛异常功能(malloc开辟空间失败后返回0)。


1.2 operator new和malloc的区别


使用方式一样,处理错误的方式不一样

20210420224256787.png


2 operator delete


2.1 概念


底层是通过free来释放空间的,为了与operator new配套才出现的,与free没什么区别。


2.2 operator delete与free


使用方式一样,处理错误的方式也一样(释放空间失败直接终止进程)。


20210420224950310.png

五. new和delete实现原理


new:operator new + 构造函数

delete:析构函数 + operator delete


1. 内置类型

new和malloc,delete和free基本类似,就是空间开辟失败时处理错误的方式不一样。


2. 自定义类型

new:调用operator new函数申请空间 + 调用构造函数完成初始化

delete:调用析构函数完成清理工作 + 调用operator delete函数释放空间。

六. malloc/free和new/delete的区别

本质: malloc/free是函数;new/delete是操作符

使用方法:开辟和释放连续空间时要用new[ ] 和 delete[ ],而malloc/free对于一个类型的空间和连续的空间都一样方法。

使用效果:new/delete会有开辟空间失败后的抛异常处理,并且开辟空间后不要可以自动识别空间类型。


七. 定位new


对于自定义类型,new开辟的空间会自动调用构造函数完成初始化。那么malloc开辟的自定义类型对象的空间怎么初始化呢?


1. 概念


在已分配的原始内存空间中显示调用构造函数初始化一个对象,它是一个操作符。


2. 用法


new (place_address) type或者new (place_address) type(initializer-list)


place_address必须是一个指针

initializer-list是类型的初始化列表

左边那个是调用默认构造函数的的形式(不传参),右边那个是调用带参数的默认构造函数的形式。


8a9ec9dffa8045d8a92a5682953f2f53.png


七. 内存泄漏


1. 概念


原本开辟的空间不要了,,因为忘记或者其他原因没有释放这块空间,就造成内存泄漏。


内存泄漏不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

区别野指针:野指针是一个指针变量指向不属于该程序的空间。

20210421000916671.png


2. 危害


对长期运行的程序(如游戏后台服务)或者设备内存本身就很小的情况内存泄漏出现内存泄漏会导致响应越来越慢,最终卡死。


3. 如何避免内存泄漏


事前预防型:如智能指针等

事后查错型:如泄漏检测工具


相关文章
|
1月前
|
C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(二)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
1月前
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
9天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
33 4
|
1月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
103 21
|
29天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 C语言 C++
【C++打怪之路Lv6】-- 内存管理
【C++打怪之路Lv6】-- 内存管理
37 0
【C++打怪之路Lv6】-- 内存管理
|
1月前
|
存储 C语言 C++
【C/C++内存管理】——我与C++的不解之缘(六)
【C/C++内存管理】——我与C++的不解之缘(六)
|
1月前
|
程序员 C语言 C++
C++入门5——C/C++动态内存管理(new与delete)
C++入门5——C/C++动态内存管理(new与delete)
68 1
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
159 1
|
1月前
|
存储 安全 程序员
【C++篇】深入内存迷宫:C/C++ 高效内存管理全揭秘
【C++篇】深入内存迷宫:C/C++ 高效内存管理全揭秘
63 3