C和C++内存管理(newmalloc和freedelete)

Posted yumoz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C和C++内存管理(newmalloc和freedelete)相关的知识,希望对你有一定的参考价值。

一图读懂内存分配

在这里插入图片描述
总结一下:

  1. 栈(堆栈),存放非静态局部变量、函数参数、返回值等
  2. 堆,用于程序运行时动态内存分配。
  3. 数据段, 存储全局数据和静态数据
  4. 代码段,存放可执行的代码,或者只读常量

malloc、calloc和realloc区别?

  • malloc是在堆上动态开辟空间;
  • calloc是堆上开空间+初始化为0;
  • realloc是对已有空间的扩容,扩容有两种方式(原地扩容和异地扩容)
    在这里插入图片描述
    原地扩容和异地扩容的差异就在扩容后地址变了。

下面体验一下calloc的初始化:
在这里插入图片描述

new & delete

对比new/malloc、delete/free

void BlogTest()
{
	int *p1 = (int*)malloc(sizeof(int) * 10);
	//申请 一个 10个int的数组
	int *p2 = new int[10];

	free(p1);
	delete[]p2;

	int *p3 = (int*)malloc(sizeof(int));
	//申请 一个 单个int的数组
	int *p4 = new int;

	free(p3);
	delete p4;

}

new 申请空间+初始化

在这里插入图片描述

new & delete操作自定义类型

先看C语言中malloc使用:
在这里插入图片描述
感受一下 new 和 delete 和 C语言中 malloc和free的区别:
在这里插入图片描述
再次感受一下new和delete的的作用:
在这里插入图片描述
发现:申请几个对象调用几次构造函数,对应也应执行几次析构函数。

operator new & operator delete

new和delete是用户进行动态内存管理的操作符,但是在低层,他是通过operator new 和operator delete来实现的。operator new实际是通过malloc 来申请空间,operator delete 低层也是通过free来释放空间的。

new 和 delete分析

对于内置类型,如果申请内置类型空间,new/delete 是申请释放单个元素空间,new[]/delete[]是申请释放连续空间;且new在空间申请失败时会抛出异常,malloc则会返回NULL
对于自定义类型,new是1)调用operator new申请空间,2)在申请的空间执行构造函数初始化; delete是1)在孔家先执行析构函数完成清理工作,2)调用operator delete完成对象孔家的释放。对于 new[] 和 delete[]本质是一样,前者先使用operator new完成N个对象空间的申请,再接着在对应空间上使用构造函数N次完成初始化。析构同理,这里不载赘述。

malloc/free 与 new/delete比较

共同点:都是在堆上申请空间,都需要用户手动释放。
不同点:

  1. malloc 、 free 是函数 ,new 、delete是操作符
  2. malloc出来的空间不会初始化,new可以
  3. malloc申请空间时,需要自己计算空间大小,new只需要在其后跟上空间类型即可,对于多个对象new时,只需要在对应“[]”里填上指定对象个数即可
  4. malloc返回值为void* ,使用时需要强转,new不需要(new后接着空间类型)
  5. malloc失败时返回NULL,使用时必须判断是否为空,new不需要,但new需要捕捉异常
  6. malloc 和 free在申请对象时不会调用构造函数和析构函数,但是new和delete会调用对应的构造函数和析构函数。

以上是关于C和C++内存管理(newmalloc和freedelete)的主要内容,如果未能解决你的问题,请参考以下文章

C 高级编程 1

C/C++内存管理详解

C/C++内存管理详解

[C++] C++中的内存管理机制

从零开始学c++——C++动态内存管理

c++中的动态内存管理