• 【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )



    博客总结 :

    • C 语言中 使用 malloc 分配的内存 , 使用 free 进行释放 ;
    • C++ 语言中 推荐 使用 new 分配的内存 , 使用 delete 进行释放 ;
    • 对于类对象来说 :
      • 使用 new 操作符 , 可以自动调用 类构造函数 进行初始化操作 ;
      • 使用 delete 操作符 , 可以自动调用 类析构函数 进行析构操作 ;
      • 因此这里建议 使用 new 创建类对象 , 使用 delete 释放对象 ;
    • 对于普通类型来说 :
      • new 操作符 与 malloc 函数 作用相同 , 都是在堆内存中为 数据分配内存 ;
      • delete 操作符 与 free 函数 作用相同 , 都是在堆内存中为 数据分配内存 ;




    一、基础数据类型数组 内存分析



    这里特别注意 , 本章节分析的 基础数据类型 的 数组 的 内存分配与释放 ,

    注意与 类对象 数组 的内存动态管理 进行区分 ;


    1、malloc 分配内存 delete 释放内存


    使用 malloc 函数 , 为 基础数据类型数组 分配内存 , 是可以使用 delete 操作符 释放该内存的 ;


    首先 , 使用 malloc 函数 , 为 int 数组分配内存空间 , 数组中存在 2 个 int 类型的元素 ;

    int* p = (int*)malloc(sizeof(int) * 2);
    
    • 1

    然后 , 使用 delete 操作符 , 将 上述分配的 int 数组内存进行释放 ;

    delete(p);
    
    • 1

    上述过程执行正常完成 , 期间没有报错 ;


    代码示例 :

    #include "iostream"
    using namespace std;
    
    int main()
    {
    
    	// 使用 malloc 申请数组 内存空间
    	int* p = (int*)malloc(sizeof(int) * 2);
    	p[0] = 10;
    	p[1] = 20;
    
    	cout << "p[0] = " << p[0] << " , p[1] = " << p[1] << endl;
    
    	// malloc 申请的内存 使用 delete 释放
    	delete(p);
    
    
    	// 控制台暂停 , 按任意键继续向后执行
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    执行结果 : 上述代码可以正常执行 , 没有警告与报错 , 说明对于 基础数据类型的数组 来说 , malloc 与 new 的操作是一致的 , 使用 malloc 分配的堆内存 , 使用 delete 也可以释放 ;

    p[0] = 10 , p[1] = 20
    Press any key to continue . . .
    
    • 1
    • 2

    在这里插入图片描述


    2、new 分配内存 free 释放内存


    使用 new 操作符 , 为 基础数据类型数组 分配内存 , 可以使用 free 函数 释放该内存 ;


    首先 , 使用 new 操作符 , 为 int 数组分配内存空间 , 数组中存在 2 个 int 类型的元素 ;

    int* p = new int[2];
    
    • 1

    然后 , 使用 free 函数 , 将 上述分配的 int 数组内存进行释放 ;

    free(p);
    
    • 1

    上述过程执行正常完成 , 期间没有报错 ;


    代码示例 :

    #include "iostream"
    using namespace std;
    
    int main()
    {
    
    	// 使用 new 申请数组 内存空间
    	int* p = new int[2];
    	p[0] = 10;
    	p[1] = 20;
    
    	cout << "p[0] = " << p[0] << " , p[1] = " << p[1] << endl;
    
    	// new 申请的内存 使用 free 释放
    	free(p);
    
    
    	// 控制台暂停 , 按任意键继续向后执行
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    执行结果 : 上述代码可以正常执行 , 没有警告与报错 , 说明对于 基础数据类型的数组 来说 , malloc 与 new 的操作是一致的 , 使用 new 分配的堆内存 , 使用 free 也可以释放 ;

    在这里插入图片描述





    二、类对象 内存分析




    1、malloc 分配内存 delete 释放内存


    使用 malloc 函数 为 Student 类对象分配 堆内存 , 不会调用 Student 的构造函数 , 只是单纯的在 堆内存中分配了一块内存 ;

    Student* p = (Student*)malloc(sizeof(Student));
    
    • 1

    分配完内存后 , 可以使用 p->m_age 访问 Student 对象的成员 ;

    使用 delete 操作符 , 可以释放有 malloc 申请的 类对象内存空间 , 该操作会调用 Student 类的析构函数 ;

    delete(p);
    
    • 1

    代码示例 :

    #include "iostream"
    using namespace std;
    
    class Student
    {
    public:
    	// 带参构造函数
    	Student(int age, int height)
    	{
    		m_age = age;
    		m_height = height;
    		cout << "执行 Student 的构造函数" << endl;
    	}
    
    	~Student()
    	{
    		cout << "执行 Student 的析构函数" << endl;
    	}
    
    public:
    	int m_age;		// 年龄
    	int m_height;	// 身高
    };
    
    int main()
    {
    
    	// 使用 malloc 申请 Student 对象的 内存空间
    	// malloc 不会调用 类对象的 构造函数
    	Student* p = (Student*)malloc(sizeof(Student));
    
    	cout << "p->m_age = " << p->m_age << " , p->m_height = " << p->m_height << endl;
    
    	// malloc 申请的内存 使用 delete 释放
    	delete(p);
    
    
    	// 控制台暂停 , 按任意键继续向后执行
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    执行结果 :

    p->m_age = -842150451 , p->m_height = -842150451
    执行 Student 的析构函数
    Press any key to continue . . .
    
    • 1
    • 2
    • 3

    在这里插入图片描述


    2、new 分配内存 free 释放内存


    使用 new 操作符 为 Student 类对象分配 堆内存 , 会调用 Student 的构造函数 , 先在堆内存为 Student 对象分配内存 , 然后再调用构造函数进行初始化 ;

    	// 使用 new 操作符 申请 Student 对象的 内存空间
    	// new 操作符 会调用 类对象的 构造函数
    	Student* p = new Student(10, 150);
    
    • 1
    • 2
    • 3

    分配完内存后 , 可以使用 p->m_age 访问 Student 对象的成员 ;

    使用 free 函数 可以释放 由 new 操作符 申请的 类对象内存空间 , 该操作不会调用 Student 类的析构函数 ;

    	// new 操作符 申请的内存 使用 free 释放
    	free(p);
    
    • 1
    • 2

    代码示例 :

    #include "iostream"
    using namespace std;
    
    class Student
    {
    public:
    	// 带参构造函数
    	Student(int age, int height)
    	{
    		m_age = age;
    		m_height = height;
    		cout << "执行 Student 的构造函数" << endl;
    	}
    
    	~Student()
    	{
    		cout << "执行 Student 的析构函数" << endl;
    	}
    
    public:
    	int m_age;		// 年龄
    	int m_height;	// 身高
    };
    
    int main()
    {
    
    	// 使用 new 操作符 申请 Student 对象的 内存空间
    	// new 操作符 会调用 类对象的 构造函数
    	Student* p = new Student(10, 150);
    
    	cout << "p->m_age = " << p->m_age << " , p->m_height = " << p->m_height << endl;
    
    	// new 操作符 申请的内存 使用 free 释放
    	free(p);
    
    
    	// 控制台暂停 , 按任意键继续向后执行
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    执行结果 : 执行时 , 使用 new 操作符调用了 Student 对象的构造函数 ,

    执行 Student 的构造函数
    p->m_age = 10 , p->m_height = 150
    Press any key to continue . . .
    
    • 1
    • 2
    • 3

    在这里插入图片描述

  • 相关阅读:
    孟克德古道徒步记录
    操作系统作业第8章和第9章(个人重点题目笔记)
    利用随机森林对特征重要性进行评估(公式原理)
    华为手机备忘录的妙用——8个小技巧总结
    鸽群优化算法(Pigeon-inspired Optimization algorithm, PIO)附matlab代码
    数学建模十大算法04—图论算法(最短路径、最小生成树、最大流问题、二分图)
    利用函数指针数组写计算器(转移表)
    【C++】C++基础知识(八)---结构体
    springboot依赖管理和自动配置
    【线上问题】Jedis Could not get a resource from the pool
  • 原文地址:https://blog.csdn.net/han1202012/article/details/133132239