首先我们先了解一下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操作符进行动态内存管理。


 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐