C/C++内存管理【超详细详解】

本文深入探讨C/C++内存管理,涵盖内存分布、C语言动态内存管理、C++的new/delete操作、operator new与operator delete函数,以及malloc/free的区别。特别讨论了内存泄漏的危害和检测方法,帮助理解动态内存分配的细节和最佳实践。
摘要由CSDN通过智能技术生成

目录

1. C/C++内存分布

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

3、C++内存管理方式 

 new/delete操作内置类型

 new和delete操作自定义类型

4、operator new与operator delete函数(重要点进行讲解)

operator new和operator delete的意义体现在new和delete的底层原理:

         重载operator new与operator delete(了解) 

new操作符和操作符new区别:

 5. new和delete的实现原理

 5.1 内置类型

 5.2 自定义类型  

6. 定位new表达式(placement-new) (了解)

7. malloc/free和new/delete的区别 

 8. 内存泄漏

 什么是内存泄漏,内存泄漏的危害

 如何检测内存泄漏(了解)


1. 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在哪里?__C__ staticGlobalVar在哪里?_C___

staticVar在哪里?_C___ localVar在哪里?__A__

num1 在哪里?_A___ char2在哪里?_A___

*char2在哪里?_A__ pChar3在哪里?_A___

*pChar3在哪里?_D___  ptr1在哪里?_A___ *ptr1在哪里?_B___

2. 填空题: sizeof(num1) = _40___; sizeof(char2) = _5___; strlen(char2) = _4___; sizeof(pChar3) = __4__; strlen(pChar3) = _5___; sizeof(ptr1) = _4___;

3.sizeof 和 strlen 区别?

sizeof操作符的结果类型为size_t(The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.)(它在头文件用typedfe定义为unsigned int类型),计算的是分配空间的实际字节数。strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间中字符的个数(不包括‘\0’)。

 【说明】

1. 又叫堆栈 -- 非静态局部变量 / 函数参数 / 返回值等等,栈是向下增长的。
2. 内存映射段 是高效的 I/O 映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共
享内存,做进程间通信。( Linux 课程如果没学到这块,现在只需要了解一下)
3. 用于程序运行时动态内存分配,堆是可以上增长的。
4. 数据段 -- 存储全局数据和静态数据。
5. 代码段 -- 可执行的代码 / 只读常量。

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

先给出一段代码演示:

void Test()
{
	int* p1 = (int*)malloc(sizeof(int));
	free(p1);
	int* p2 = (int*)calloc(4, sizeof(int));
	free(p2);
	int* p3 = (int*)realloc(p2, sizeof(int) * 10);
	free(p3);
}

malloc:
在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度,返回该区域的首地址

calloc:
与malloc相似,不过函数calloc() 会将所分配的内存空间中的每一位都初始化为零

realloc:
 给一个已经分配了地址的指针重新分配空间,可以做到对动态开辟内存大小的调整。

calloc、malloc、realloc函数的区别及用法 

相同点:

1.都是C语言标准库提供的从堆上申请内存空间的方法。

2.使用时需要包含stdlib.h头文件

3.返回值都是void*,使用时必须进行强转

4.申请成功返回空间首地址,失败则返回NULL,因此使用的时候一定要进行判空

5.用完之后一定要进行free释放,否则会有内存泄漏。

不同点:

void* mallod(size_t size)

size:要申请的空间总共占的字节数

void* calloc(size_t num,size_t size)

num:申请num个元素的空间

size:每个元素所占的字节数

num*size的含义就和malloc'参数的函数相同,但是其会将申请的空间中的内容全部初始化为0

void* realloc(void* p,size_t newsize)

1.p为NULL,该方法相当于malloc

2.p非空,将p指向的空间大小调整为newsize个字节

3、C++内存管理方式 

C 语言内存管理方式在 C++ 中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值