C/C++(初阶)—— 内存管理

目录

一. C/C++内存分布

1.C/C++内存区域划分

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

三. C++中动态内存管理

3.1 内置类型的 new、delete

3.2 自定义类型的 new、delete

四. operator new与operator delete函数

五. new和delete的实现原理

5.1内置类型

5.2自定义类型


 

一. C/C++内存分布

1.C/C++内存区域划分

在C/C++内存分区大致分为内核、栈、内存映射段、堆、数据段(也叫静态区)、代码段(也叫常量区)等

在C/C++学习上我们需要重点了解的部分就是栈、堆、数据段(静态区)、代码段(常量区)

C/C++(初阶)—— 内存管理_第1张图片

必备知识:

:存放非静态的局部变量、函数参数、函数返回值等等,this指针也是存放在栈上的,栈是向下生长的

:用于程序运行时动态内存分配,堆是可以上增长的。例如malloc和new所分配的空间。

数据段(静态区):存放全局变量,静态变量。

代码段(常量区):可执行的代码/只读常量。

根据上述的必备知识,看下面一段代码,看看是否能将各种变量和数据在内存的哪一些分区进行对。

C/C++(初阶)—— 内存管理_第2张图片

答案如下:

C/C++(初阶)—— 内存管理_第3张图片

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

在C语言中进行动态内存开辟的主要是 malloc/realloc/calloc

进行释放的是 free

void Test ()
{
    int* p1 = (int*) malloc(sizeof(int));
    free(p1);
    // void *malloc(unsigned int num_bytes)
    //(类型指针)malloc(开辟的字节空间)

    int* p2 = (int*)calloc(4, sizeof (int));
    //void *calloc(size_t n, size_t size)
    //(类型指针)calloc(开辟几个空间 ,开辟的字节空间)

    int* p3 = (int*)realloc(p2, sizeof(int)*10);
    //void realloc(void *ptr, size_t new_Size)
    //(类型指针)realloc(指针,增加开辟的字节空间)
    free(p3);
}

三. C++中动态内存管理

在C++中,进行动态内存开辟的主要是new

进行释放的是 delete

3.1 内置类型的 new、delete

void Test()
{
  // 动态申请一个int类型的空间
  int* ptr4 = new int;
  
  // 动态申请一个int类型的空间并初始化为10
  int* ptr5 = new int(10);
  
  // 动态申请10个int类型的空间
  int* ptr6 = new int[3];
  delete ptr4;
  delete ptr5;
  delete[] ptr6;
}

3.2 自定义类型的 new、delete

对于自定义类型来讲用法于内置类型相同,但作用相比于malloc/calloc/realloc来讲有着明显的区别就是在new定义的时候会调用自定义类型的构造函数,在delete释放时会调用自定义类型的析构函数。

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用 new[]和delete[]。不匹配使用根据编译器的不同可能会导致无法编译和程序运行错误

四. operator new与operator delete函数

operator new 和 operator delete 两个函数是 new和delete 两个操作符的底层实现,也就是说new和delete是调用了这两个函数实现的对应功能。

opreatoer new 和 operator delete 两个函数的实现在C++库中最终也是用malloc 和 free实现的

所以我们可以得出 new 和 delete 是 C++ 对于C语言 中的malloc和free 的功能升级。

逻辑如下:

new、delete -> operator new 、operator delete -> malloc、free

需要额外注意的点是,new失败是抛出异常malloc是返回NULL 

五. new和delete的实现原理

5.1内置类型

new和malloc,delete和free基本类似,不同的地方是: new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常malloc会返回NULL。

5.2自定义类型

new:     1.调用operator new      2. 调用构造函数进行初始化

delete:  1.调用operator delete  2. 调用析构函数释放空间

new [N]:  1.调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对 象空间的申请                      2.在申请的空间上执行N次构造函数

delete[]   1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理

                2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释 放空间

你可能感兴趣的:(c++)