【C++】一篇带你了解C++中的动态内存管理
首先我们先了解一下C/C++程序内存分配的几个区域:代码语言:javascriptAI代码解释从上面那副图中,我们可以清晰的看到,函数体中的。而有。
·
首先我们先了解一下C/C++程序内存分配的几个区域:
代码语言:javascript
AI代码解释
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));
int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
free(ptr1);
free(ptr3);
}

- 栈区:在函数运行时,函数内的局部变量的储存单元会在栈上被创建,在函数执行结束时这些储存单元会被自动释放。
- 堆区:一般是由程序员自主分配和和释放的,如果最后没有被释放的话,可能由OS回收。
- 数据段(静态区):存放全局变量、静态变量。程序结束后由系统自动回收。
- 代码段(常量区):存放常量、函数体(类成员函数、全局函数)的二进制代码。
从上面那副图中,我们可以清晰的看到,函数体中的局部变量都是在栈(stack)上分配空间的,而它们一出作用域就会被释放。而有static修饰的静态变量是储存在数据段的,而在数据段上创建的变量会在程序运行结束后销毁,也就是静态变量的数据周期更长。
2. C语言中的动态内存管理方式:malloc/calloc/realloc/free
在C语言中,我们通常使用malloc、calloc、realloc来进行内存的动态分配,同时提供了free来进行内存的释放和回收。而这三个内存分配的函数我们要重点强调它们的区别和使用。
2.1. malloc、calloc、realloc三者的区别在哪?
- malloc:是申请一块连续的内存,并返回指向这块内存的指针
- calloc:与malloc的功能一样,只不过在返回指针之前,将所有申请到的空间的字节初始化为0
- realloc:能够实现对空间的动态调整
我们从对着三个函数的定义也能看到区别:
代码语言:javascript
AI代码解释
void Test()
{
int* p1 = (int*)malloc(sizeof(int));
cout << sizeof(p1) << endl;
free(p1);
int* p2 = (int*)calloc(4, sizeof(int));
int* p3 = (int*)realloc(p2, sizeof(int) * 10);
cout << sizeof(p2) << endl;
cout << sizeof(p3) << endl;
free(p3);
}
3. C++中的内存管理方式
我们当然知道C++肯定是兼容C语言的内存管理方式的,但是有的时候C的内存管理方式确实无能为力,这时候就需要用到C++自己的内存管理方式:使用new、delete操作符进行动态内存管理。
更多推荐


所有评论(0)