文章目录
- c/c++内存管理
- c语言动态内存管理
- c++动态内存管理
- new/delete自定义类型妙用
- operator new和operator delete
- malloc/new,free/delete区别
c/c++内存管理
int globalVar = 1;static int staticGlobalVar = 1;void Test(){static int staticVar = 1;int localVar = 1;int num1[10] = { 1, 2, 3, 4 };char char2[] = "abcd";const char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int) * 4);int* ptr2 = (int*)calloc(4, sizeof(int));//开辟4个int空间,并初始化0,int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3);}
1,栈,又叫堆栈,存储非局部变量/函数参数/返回值,向下生长,
2,堆,存储动态开辟数据,用于程序运行的内存分配,向上生长,
3,数据段,存储全局变量,静态变量,
4,代码段,存储可执行代码/只读常量,
c语言动态内存管理
#include <stdio.h>
#include <stdlib.h>
int main()
{int* p1 = (int*)malloc(sizeof(int) * 5);free(p1);int* p2 = (int*)malloc(sizeof(int) * 5);//分配5个int内存并初始化0,int* p3 = (int*)realloc(p2,sizeof(int) * 10);//将p2扩大到10个内存,也可以缩小,p2 = p3;free(p2);return 0;
}
calloc对开辟的内存直接初始化0,realloc可以扩充或缩小数组
c++动态内存管理
有关C语言的动态内存函数在c++还能用,但用起来麻烦,所以c++提出自己的动态内存管理,
:通过new和delete操作符进行动态内存管理
#include <iostream>
using namespace std;
int main()
{int* p1 = new int;int* p2 = new int(10);int* p3 = new int[4];delete p1;delete p2;delete[] p3;return 0;
}
p1正是开辟一个int内存;
p2开辟1个int内存并初始化为10,记住用括号,
p3开辟4个int内存,记住用方括号,
p1,p2正常删除,p3 delete后面加方括号
申请开辟连续空间和释放,[]匹配使用
new/delete自定义类型妙用
#include <iostream>
using namespace std;
class A {
public:A(int a=0): _a(a){cout << "A():" <<this<< endl;}~A(){cout << "~A():" <<this<< endl;}
private:int _a;
};
int main()
{A* p1 = (A*)malloc(sizeof(A));free(p1);A* p2 = new A(4);delete p2;A* p3 = new A[5];delete[] p3;return 0;
}
A():000001F1BFF08110
~A():000001F1BFF08110
A():000001F1BFF159E8
A():000001F1BFF159EC
A():000001F1BFF159F0
A():000001F1BFF159F4
A():000001F1BFF159F8
~A():000001F1BFF159F8
~A():000001F1BFF159F4
~A():000001F1BFF159F0
~A():000001F1BFF159EC
~A():000001F1BFF159E8
是的,🚩new与delete对自定义类型可以直接调用构造和析构函数
而malloc和free不会
operator new和operator delete
operator new和operator delete是系统提供的全局函数,
🚩使用操作符new和delete实际上在底层上调用这两个全局函数来申请和释放空间,
(实际上operator new也是通过malloc开辟空间,如果成功直接返回,如果空间不足就执行用户的限制条件,若无限定条件直接报错,operator delete也是通过free释放的,同理)
malloc/new,free/delete区别
共同:都能从堆申请空间,并且都要手动释放
🚩1,new和delete是操作符,那两是函数,
🚩2,malloc申请空间不会初始化,new会初始化
3,malloc需要自己计算空间大小并传递,new只需要在后面加类型即可,
4, malloc需要强转,因为自己是void*()类型,new只需加空间类型
🚩5,malloc申请空间失败返回NULL必须判空,new不需要,但需要捕获异常,
🚩6,申请自定义对象时,new和delete会调用构造和析构函数,那两不会