自学内容网 自学内容网

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));
 int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
 free(ptr1);
 free(ptr3);
}
1. 选择题:
   选项: A.栈  B.堆  C.数据段(静态区)  D.代码段(常量区)
   globalVar在哪里?____   staticGlobalVar在哪里?____   staticVar在哪里?____   localVar在哪里?____
   num1 在哪里?____
   
   char2在哪里?____   *char2在哪里?___
   pChar3在哪里?____      *pChar3在哪里?____
   ptr1在哪里?____        *ptr1在哪里?____

 这里从网上找的一道题目。

globakVar是全局变量,存在静态区。staticGlobalVar是全局静态变量,存在静态区。staticVar是静态变量,存在静态区。localVar是局部变量,存在栈中。num1是数组名,也是首元素地址,存在栈中。char2是数组名,也是首元素地址,存在栈中。*char2是该数组第一个元素,存在栈中。pChar3是指针变量,存在栈中,*pChar3是由const修饰的,pChar3指向的内容不能修改,内容具有常属性,因此pChae3存在代码段中,也就是常量区。ptr1是指针,存在栈中。*ptr1是指向动态开辟的空间,是在堆中。

C语言中动态内存管理方式

malloc/calloc/realloc/free

那么我来说一说malloc/calloc/realloc的区别。

      malloc只有一个参数,传的参数单位是字节,并且开辟空间后不会对数据初始化,返回的是指向已开辟空间的指针。

calloc有2个参数,第一个是要开辟元素的个数,第二个是每个元素的字节大小,并且会为每个元素进行初始化为0的操作。

更改ptr指向空间的大小。如果更改空间时候发现没有连续空间可以开辟,可以将内存块移动到新位置进行开辟。如果ptr是空指针,该函数的行为类似于分配内存,分配一个大小为字节的新块并返回指向其开头的指针。

 C++内存管理方式

通过new和delete操作符进行动态内存管理。

//动态开辟一个int类型大小的空间
int* ptr1 = new int;
//动态开辟一个int类型大小的空间并初始化
int* ptr2 = new int(1);
//动态开辟一个int类型的数组有10个元素
int* ptr3 = new int[10];
//这是释放单个元素的
delete ptr1;
delete ptr2;
//这是释放数组的
delete[] ptr3;

如果不初始化,默认是随机值。

new/delete和malloc/free的区别之一就是对于自定义类型new/delete除了开空间还会调用其构造和析构函数。 

operator new与operator delete函数

当用new申请一个自定义类型的空间时,new会在底层调用operator new函数,然后调用malloc函数。

当用delete来释放一块空间时,调用析构函数的之后会在底层调用operator delete函数。

内存泄漏

       什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

       内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,出现内存泄漏会导致响应越来越慢,最终卡死。

      堆内存泄漏(Heap leak)
堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存,用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak。
     系统资源泄漏
指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。


原文地址:https://blog.csdn.net/panzii666/article/details/143487324

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!