C++ —— 内存管理

文章目录

  • 1. 回顾C语言内存管理
  • 2.C++的动态内存管理方式
    • 2.1 new/delete操作内置类型
    • 2.2 new和delete操作自定义类型
  • 3. operator new 和 operator delete函数
    • 3.1 operator new 与operator delete 函数
  • 4. new和delete的实现原理
    • 4.1 内置类型
    • 4.2 自定义类型
  • 5. new和delete操作不匹配(了解)
  • 6. 定位new表达式(了解)
  • 7. 常见面试题
    • 7.1 malloc/free和new/delete的区别
    • 7.2 内存泄漏
      • 7.2.1 什么是内存泄漏,内存泄漏的危害
      • 7.2.2 内存泄漏分类


1. 回顾C语言内存管理

先来复习下在C语言学习到的内存管理知识,内存区域划分大致分为以下几种:
C++ —— 内存管理_第1张图片
知识点:
1. 栈 又叫堆栈,存放非静态局部变量 / 函数参数 / 返回值等等,栈是向下增长的(向着低地址方向增长);
2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享内容,做进程间通信。
3. 用于程序运行时动态内存分配,堆是向上增长的(向着高地址方向增长);
4. 数据段 是存储全局数据和静态数据的;
5. 代码段 是存储可执行代码和只读常量的;

注意:这里的可执行代码是指我们在运行程序生成 .exe 后的代码。如果我们没有运行程序,那么代码是存放在磁盘上的;当我们运行程序后,代码才会被加载到内存中的代码段

再来看看下面的代码练习:

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在哪里?____
2. 填空题:
sizeof(num1) = ____; 
sizeof(char2) = ____;    strlen(char2) = ____;
sizeof(pChar3) = ____;   strlen(pChar3) = ____;
sizeof(ptr1) = ____;

选择题:

globalvar: 定义在函数体外部,属于全局变量,全局变量处于静态区
staticGlobalVar: 既定义在函数体外部,又被static修饰,处于 静态区
staticVar: 虽然位于函数体中,但被static修饰,属于静态变量,处于静态区
localVar: 属于局部变量,处于栈区
num1 : 是静态数组的数组名,也就是指针,处于栈区
char2: 同样是静态数组的数组名,也就是指针,处于栈区
*char2: 解引用数组名,表示数组第一个元素,由于数组是在栈区开辟的,所以第一个元素处于栈区
pChar3: 是指针,处于栈区
*pChar3: 与上面的char2不同,这里并不会在栈区开辟空间存储"abcd",这里的字符串由编译器提供,属于常量,只有一份,位于常量区;所以解引用指针得到字符串的第一个元素’a’,'a’处于常量区
ptr1: 是指针,处于栈区
*ptr1: ptr1指针指向一块在堆上开辟的空间,解引用该指针得到该空间上的第一个元素,该元素处于堆区

填空题(在32位平台下):

sizeof(num1): num1指向一块在栈上开辟了能够存储10个整型元素的空间,并初始化了前四个元素,该空间总大小为sizeof(int) * 10 -> 40
sizeof(char2): char2指向一块在栈上

你可能感兴趣的:(C++,c++,开发语言)