C/C赋予程序员管理内存的自由是C/C语言特色虽然这引入了复杂度和危险性但另一方面它也增加了控制力和灵活性是C/C独特之处亦是强大之处。C/C内存分布让我们先来看看下面这段代码123456789101112131415intglobalVar 1;staticintstaticGlobalVar 1;voidTest(){staticintstaticVar 1;intlocalVar 1;intnum1[10] { 1, 2, 3, 4 };charchar2[] abcd;char* pChar3 abcd;int* ptr1 (int*)malloc(sizeof(int)* 4);int* ptr2 (int*)calloc(4,sizeof(int));int* ptr3 (int*)realloc(ptr2,sizeof(int)* 4);free(ptr1);free(ptr3);}你知道代码中的各个部分分别存储在内存中的哪一个区域吗【说明】1、栈又叫堆栈用于存储非静态局部变量/函数参数/返回值等等栈是向下增长的。2、内存映射段是高效的I/O映射方式用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存做进程间通信。3、堆用于存储运行时动态内存分配堆是向上增长的。4、数据段又叫静态区用于存储全局数据和静态数据。5、代码段又叫常量区用于存放可执行的代码和只读常量。顺便提一下为什么说栈是向下增长的而堆是向上增长的简单来说在一般情况下在栈区开辟空间先开辟的空间地址较高而在堆区开辟空间先开辟的空间地址较低。例如下面代码中变量a和变量b存储在栈区指针c和指针d指向堆区的内存空间1234567891011121314151617#include iostreamusingnamespacestd;intmain(){//栈区开辟空间先开辟的空间地址高inta 10;intb 20;cout a endl;cout b endl;//堆区开辟空间先开辟的空间地址低int* c (int*)malloc(sizeof(int)* 10);int* d (int*)malloc(sizeof(int)* 10);cout c endl;cout d endl;return0;}因为在栈区开辟空间先开辟的空间地址较高所以打印出来a的地址大于b的地址在堆区开辟空间先开辟的空间地址较低所以c指向的空间地址小于d指向的空间地址。注意在堆区开辟空间后开辟的空间地址不一定比先开辟的空间地址高。因为在堆区后开辟的空间也有可能位于前面某一被释放的空间位置。C语言中动态内存管理方式malloc、calloc、realloc和free一、mallocmalloc函数的功能是开辟指定字节大小的内存空间如果开辟成功就返回该空间的首地址如果开辟失败就返回一个NULL。传参时只需传入需要开辟的字节个数。二、calloccalloc函数的功能也是开辟指定大小的内存空间如果开辟成功就返回该空间的首地址如果开辟失败就返回一个NULL。calloc函数传参时需要传入开辟的内存用于存放的元素个数和每个元素的大小。calloc函数开辟好内存后会将空间内容中的每一个字节都初始化为0。三、reallocrealloc函数可以调整已经开辟好的动态内存的大小第一个参数是需要调整大小的动态内存的首地址第二个参数是动态内存调整后的新大小。realloc函数与上面两个函数一样如果开辟成功便返回开辟好的内存的首地址开辟失败则返回NULL。realloc函数调整动态内存大小的时候会有三种情况1、原地扩。需扩展的空间后方有足够的空间可供扩展此时realloc函数直接在原空间后方进行扩展并返回该内存空间首地址即原来的首地址。2、异地扩。需扩展的空间后方没有足够的空间可供扩展此时realloc函数会在堆区中重新找一块满足要求的内存空间把原空间内的数据拷贝到新空间中并主动将原空间内存释放即还给操作系统返回新内存空间的首地址。3、扩充失败。需扩展的空间后方没有足够的空间可供扩展并且堆区中也没有符合需要开辟的内存大小的空间。结果就是开辟内存失败返回一个NULL。四、freefree函数的作用就是将malloc、calloc以及realloc函数申请的动态内存空间释放其释放空间的大小取决于之前申请的内存空间的大小。若还想进一步了解malloc、calloc、realloc和free请阅读C语言动态内存管理。C中动态内存管理方式首先C语言内存管理的方式在C中可以继续使用。但有些地方就无能为力而且使用起来比较麻烦因此C又提出了自己的内存管理方式通过new和delete操作符进行动态内存管理。new和delete操作内置类型一、动态申请单个某类型的空间1234//动态申请单个int类型的空间int* p1 newint;//申请deletep1;//销毁其作用等价于1234//动态申请单个int类型的空间int* p2 (int*)malloc(sizeof(int));//申请free(p2);//销毁二、动态申请多个某类型的空间1234//动态申请10个int类型的空间int* p3 newint[10];//申请delete[] p3;//销毁其作用等价于1234//动态申请10个int类型的空间int* p4 (int*)malloc(sizeof(int)* 10);//申请free(p4);//销毁三、动态申请单个某类型的空间并初始化1234//动态申请单个int类型的空间并初始化为10int* p5 newint(10);//申请 赋值deletep5;//销毁其作用等价于12345//动态申请一个int类型的空间并初始化为10int* p6 (int*)malloc(sizeof(int));//申请*p6 10;//赋值free(p6);//销毁四、动态申请多个某类型的空间并初始化1234//动态申请10个int类型的空间并初始化为0到9int* p7 newint[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};//申请 赋值delete[] p7;//销毁其作用等价于12345678//动态申请10个int类型的空间并初始化为0到9int* p8 (int*)malloc(sizeof(int)* 10);//申请for(inti 0; i 10; i)//赋值{p8[i] i;}free(p8);//销毁注意申请和释放单个元素的空间使用new和delete操作符申请和释放连续的空间使用new[ ]和delete[ ]。new和delete操作自定义类型对于以下自定义类型123456789101112131415classTest{public:Test()//构造函数:_a(0){cout 构造函数 endl;}~Test()//析构函数{cout 析构函数 endl;}private:int_a;};一、动态申请单个类的空间用new和delete操作符123Test* p1 newTest;//申请deletep1;//销毁用malloc和free函数123Test* p2 (Test*)malloc(sizeof(Test));//申请free(p2);//销毁二、动态申请多个类的空间用new和delete操作符123Test* p3 newTest[10];//申请delete[] p3;//销毁用malloc和free函数123Test* p4 (Test*)malloc(sizeof(Test)* 10);//申请free(p4);//销毁注意在申请自定义类型的空间时new会调用构造函数delete会调用析构函数而malloc和free不会。总结一下1、C中如果是申请内置类型的对象或是数组用new/delete和malloc/free没有什么区别。2、如果是自定义类型区别很大new和delete分别是开空间构造函数、析构函数释放空间而malloc和free仅仅是开空间和释放空间。3、建议在C中无论是内置类型还是自定义类型的申请和释放尽量都使用new和delete。operator new和operator delete函数new和delete是用户进行动态内存申请和释放的操作符operator new和operator delete是系统提供的全局函数new和delete在底层是通过调用全局函数operator new和operator delete来申请和释放空间的。operator new和operator delete的用法和malloc和free的用法完全一样其功能都是在堆上申请和释放空间。