当前位置: 首页 > news >正文

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

文章目录

  • 一、C++ 对象的动态创建和释放
    • 1、C 语言 对象的动态创建和释放 的方式
    • 2、C++ 语言 对象的动态创建和释放 的方式
  • 二、代码示例 - 对象的动态创建和释放





一、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;	// 身高
};

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


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


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

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

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

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

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


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

free(p);

代码示例 :

	// 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);

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

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

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


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

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

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

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

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

delete(p2);

特别注意 : 使用 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);

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

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




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



下面的代码中 , 分别使用了 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;
}

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

http://www.lryc.cn/news/171170.html

相关文章:

  • AMS爆炸来袭,上线即巅峰
  • 是面试官放水,还是公司实在是太缺人?这都没挂,华为原来这么容易进...
  • 怒刷LeetCode的第2天(Java版)
  • AUTOSAR汽车电子嵌入式编程精讲300篇-车载CAN总线网络的异常检测(续)
  • mojo安装
  • 【探索Linux】—— 强大的命令行工具 P.8(进程地址空间)
  • vue3 - Element Plus 切换主题色及el-button hover颜色不生效的解决方法
  • 【C++面向对象侯捷】1.C++编程简介
  • 年龄大了转嵌入式有机会吗?
  • Mysql高级——索引优化和查询优化(2)
  • SpringMVC的拦截器和JSR303的使用
  • servlet中doGet方法无法读取body中的数据
  • Ubuntu MongoDB账户密码设置
  • 指针进阶(3)
  • 信息检索与数据挖掘 | (二)布尔检索与倒排索引
  • 【学习笔记】EC-Final 2022 K. Magic
  • MySQL数据库笔记
  • 大数据之Hive(三)
  • 让高分辨率的相机芯片输出低分辨率的图片对于像素级的值有什么影响?
  • FastGPT 接入飞书(不用写一行代码)
  • 蓝桥杯 题库 简单 每日十题 day6
  • 使用Arduino简单测试HC-08蓝牙模块
  • 如何在 CentOS 8 上安装 OpenCV?
  • 一台主机外接两台显示器
  • 笔记-搭建和使用docker-registry私有镜像仓库
  • 爬虫框架Scrapy学习笔记-2
  • 6.1 使用scikit-learn构建模型
  • React 全栈体系(十一)
  • AI 时代的向量数据库、关系型数据库与 Serverless 技术丨TiDB Hackathon 2023 随想
  • Vue的路由使用,Node.js下载安装及环境配置教程 (超级详细)