• 【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )






    一、C++ 对象的动态创建和释放



    使用 C 语言中的 malloc 函数 可以为 类对象 分配内存 ;

    • 使用 free 函数可以释放上述分配的内存 ;

    使用 C++ 语言中的 new 运算符 也可以为 类对象 分配内存 ;

    • 使用 delete 运算符 可以释放上述分配的内存 ;

    首先 , 定义一个类 Student , 再为其定义一个有参的构造函数 , 和 析构函数 ;

    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;	// 身高
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    之后 , 分别使用 C 语言的 动态内存管理 和 C++ 语言的 动态内存管理 , 分别创建和释放 Student 类实例对象 ;


    1、C 语言 对象的动态创建和释放 的方式


    C 语言中提供了 malloc / calloc 等申请 堆内存的 函数 ;

    这里 使用 C 语言 的 malloc 函数的申请方式 , 为 Student 类实例对象 在 堆内存 中 , 申请内存空间 ;

    使用 malloc 函数 申请 sizeof(Student) 字节大小的堆内存 , 并将返回的指针转为 Student* 类型 ;

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

    特别注意 : 上述申请内存 的方式 , 不会触发 Student 类的 构造函数 , 相应的 free 函数释放指针 , 也不会触发 Student 类的析构函数 ;


    Student 类对象释放时 , 使用 free 函数将其释放即可 ;

    free(p);
    
    • 1

    代码示例 :

    	// C 语言中 为类对象 动态申请内存
    	Student* p = (Student*)malloc(sizeof(Student));
    
    	// 打印对象数据
    	cout << "p->m_age = " << p->m_age << " , p->m_height = " << p->m_height << endl;
    
    	// C 语言中 释放内存 与 malloc 相对应
    	free(p);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    执行结果 : 上面的代码 , 执行 , 并没有触发 Student 类的 构造函数与析构函数 , 打印出的 Student 对象值也是随机值 , 这是没有经过赋值的随机值 ;

    p->m_age = -842150451 , p->m_height = -842150451
    
    • 1

    2、C++ 语言 对象的动态创建和释放 的方式


    在 C++ 语言中 , 使用 new 和 delete 进行 对象的动态创建和释放 ;

    使用 new Student(10, 150) 代码 , 可以在堆内存中申请 Student 对象的内存空间 , 并且会自动调用 Student 类的构造函数 , 对申请的内存空间进行初始化操作 ;

    该代码会返回一个 Student 类型的指针变量 , 借助 该指针 , 可以通过 -> 符号访问 Student 对象的成员 ;

    Student* p2 = new Student(10, 150);
    
    • 1

    堆内存 中的 Student 对象使用完毕后 , 可以使用 delete 操作符释放该内存 , 释放时会自动调用 Student 类的析构函数 ;

    delete(p2);
    
    • 1

    特别注意 : 使用 new 和 delete 运算符 进行 对象的动态创建和释放 , 会自动调用对象的 构造函数 和 析构函数 ;


    代码示例 :

    	// C++ 语言中动态申请内存
    	Student* p2 = new Student(10, 150);
    
    	// 打印对象数据
    	cout << "p2->m_age = " << p2->m_age << " , p2->m_height = " << p2->m_height << endl;
    
    	// C++ 语言中 释放内存 与 new 相对应
    	delete(p2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    执行结果 : 上述代码执行时 ,

    • new 运算符 创建 Student 类对象 , 会触发 Student 类的构造函数 ;
    • 打印对象数据时 , 直接将 创建 Student 对象时传入到构造函数中的数据打印出来 , 说明是调用的构造函数对该对象进行的初始化 ;
    • 最后通过调用 delete 运算符 释放了 Student 对象 , 会触发 Student 类的析构函数 ;
    执行 Student 的构造函数
    p2->m_age = 10 , p2->m_height = 150
    执行 Student 的析构函数
    Press any key to continue . . .
    
    • 1
    • 2
    • 3
    • 4




    二、代码示例 - 对象的动态创建和释放



    下面的代码中 , 分别使用了 C 语言的方式 和 C++ 语言的方式 , 对类对象进行动态内存分配 ;


    代码示例 :

    #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()
    {
    	// 为类对象内存分配
    
    	// C 语言中 为类对象 动态申请内存
    	Student* p = (Student*)malloc(sizeof(Student));
    
    	// 打印对象数据
    	cout << "p->m_age = " << p->m_age << " , p->m_height = " << p->m_height << endl;
    
    	// C 语言中 释放内存 与 malloc 相对应
    	free(p);
    	
    
    	// C++ 语言中动态申请内存
    	Student* p2 = new Student(10, 150);
    
    	// 打印对象数据
    	cout << "p2->m_age = " << p2->m_age << " , p2->m_height = " << p2->m_height << endl;
    
    	// C++ 语言中 释放内存 与 new 相对应
    	delete(p2);
    
    	
    	
    
    	// 控制台暂停 , 按任意键继续向后执行
    	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
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    执行结果 :
    在这里插入图片描述

  • 相关阅读:
    Allegro Design Entry HDL(OrCAD Capture HDL)编辑对象菜单详细介绍
    第十三届蓝桥杯C++C组省赛H题—— 重新排序(AC)
    php简单年龄计算器案例
    HTTP1.1、HTTP2、HTTP3 演变
    代码优化与程序加速指南——针对数值优化和深度学习领域
    leetcode:6248. 统计中位数为 K 的子数组【问题转化 + 排序二分】
    中文drupal教程(3)响应对象Response及Cookie设置
    HCIA-R&S自用笔记(23)DHCP
    经验之谈:内存泄露的原因以及分析
    Vscode爆红Delete `␍`eslintprettier/prettier
  • 原文地址:https://blog.csdn.net/han1202012/article/details/133092077