【C++】动态内存分配(关于构造与析构函数的调用)动态数组类 动态创建多维数组 知识点+代码学习记录

一.动态内存分配相关知识点

1.堆和栈内存

堆内存:动态分配的内存位于堆中,它不受作用域限制,由程序员控制其生命周期。

栈内存:局部变量和函数参数等自动分配的内存位于栈中,由编译器自动管理。

2.newdelete操作符

new:用于在堆上分配内存,可以分配单个对象或对象数组。

delete:用于释放由new分配的单个对象的内存。

delete[]:用于释放由new[]分配的对象数组的内存。

3.内存泄漏

如果忘记使用deletedelete[]释放内存,可能会导致内存泄漏,即程序占用的内存不会被释放,直到程序终止。

4.构造函数和析构函数

当使用new创建对象时,相应的构造函数会被调用。

使用deletedelete[]释放对象时,相应的析构函数会被调用,用于清理对象占用的资源。

5.智能指针

C++11及更高版本引入了智能指针(如std::unique_ptrstd::shared_ptr),它们可以自动管理内存,避免内存泄漏。

6.mallocfree函数

这些是C风格的动态内存分配和释放函数,但在C++中推荐使用newdelete,因为它们能够调用构造函数和析构函数。

7.动态数组分配

可以使用new T[n]来分配一个包含n个T类型的对象的数组,并使用delete[]来释放这个数组。

二.关于构造与析构函数的调用代码实例

#include<iostream>using namespace std;
class Point {
public:Point() :x(10), y(10) {cout << "调用Point给出的默认构造函数" << endl;}Point(int x, int y) :x(x), y(y) {cout << "调用Point含参构造函数" << endl;}~Point() {cout << "调用Point析构函数" << endl;}void show() const {cout << x << "  " << y << endl;}
private:int x, y;
};class Point2 {
public:~Point2() {cout << "调用Point2析构函数" << endl;}void show() const{cout << x << "  " << y << endl;}
private:int x, y;
};int main() {cout << "不给出参数列表" << endl;//new动态内存分配,申请内存,成功则返回一个指向新分配内存的首地址(申请失败出现异常)Point* ptr1 = new Point;(*ptr1).show();//防止“内存泄漏”,但是delete是“释放指针所指向的内存空间,是删除new对象,而不是删除指针本身”//调用new建立对象的析构函数delete ptr1;//用户给出了默认构造函数//不能重复声明指针ptr1 = new Point();(*ptr1).show();delete ptr1;cout << "给出参数列表" << endl;Point* ptr2 = new Point(1, 4);(*ptr2).show();delete ptr2;//用户没给出默认构造函数,调用系统的(此时类里面不能有用户给出的无参数或有参数构造函数)//无括号时,单纯调用默认构造函数,不初始化Point2* ptr3 = new Point2;ptr3->show();delete ptr3;//有括号时,在调用默认构造函数时,会自动初始化元素为0,并且递归初始化ptr3 = new Point2();ptr3->show();delete ptr3;cout << "------1------" << endl;//动态创建对象数组//ptr相当与一个数组名,数组中的每个元素都是指向Point类的指针Point* ptr = new Point[2];ptr[0].show();ptr[1].show();//注意delete格式delete[]ptr;
}
//终端输出
不给出参数列表
调用Point给出的默认构造函数
10  10
调用Point析构函数
调用Point给出的默认构造函数
10  10
调用Point析构函数
给出参数列表
调用Point含参构造函数
1  4
调用Point析构函数
-842150451  -842150451
调用Point2析构函数
0  0
调用Point2析构函数
------1------
调用Point给出的默认构造函数
调用Point给出的默认构造函数
10  10
10  10
调用Point析构函数
调用Point析构函数

三.动态数组类

#include<iostream>
//拥有“assert”“断言”:
//可以判断一个表达式的值是否为true,如果不为true,程序会终止并且报告错误地点
#include<cassert>
using namespace std;
class Point {
public:Point() :x(10), y(10) {cout << "调用Point给出的默认构造函数" << endl;}Point(int x, int y) :x(x), y(y) {cout << "调用Point含参构造函数" << endl;}~Point() {cout << "调用Point析构函数" << endl;}void show() const {cout << x << "  " << y << endl;}
private:int x, y;
};
//动态数组类
class ArrayOfPoints {
private:Point* points;  //指向动态数组首地址int size;    //数组大小
public:ArrayOfPoints(int size) :size(size) {points = new Point[size];}~ArrayOfPoints() {cout << "Deleting..." << endl;delete[]points;}//获取下标为Index的元素//返回引用可以对该下标元素进行修改Point& element(int index) {assert(index >= 0 && index < size);    //下标越界程序立即停止return points[index];}
};int main() {int count;cin >> count;//创建对象数组ArrayOfPoints point(count);//通过类安全的访问数组成员point.element(2).show();//point.element(10).show();cout << "Ending..." << endl;return 0;
}

四.动态创建多维数组

#include<iostream>
using namespace std;
int main() {//cp是一个指向一个二维的9x8的数组的指针,定义了一个cp[8]float(*cp)[9][8] = new float[8][9][8];for (int i = 0; i < 8; i++) {for (int j = 0; j < 9; j++) {for (int k = 0; k < 8; k++) {//以指针形式数组元素*(*(*(cp + i) + j) + k) = static_cast<float>(i * 100 + j * 10 + k);}}}for (int i = 0; i < 8; i++) {for (int j = 0; j < 9; j++) {for (int k = 0; k < 8; k++) {//将指针cp作为数组名使用,访问数组下标cout << cp[i][j][k] << " ";}cout << endl;}cout << endl;}// 注意删除格式delete[] cp;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

性能测试(2)

jmeter参数化 loadrunner Jmeter IP欺骗&#xff0c;也称为IP欺诈&#xff0c;是指通过伪装、篡改IP地址的方式&#xff0c;进行网络攻击或欺骗行为。这种行为可能会导致网络安全问题&#xff0c;包括身份盗窃、数据泄露、DDoS攻击等。为了保护自己的网络安全&#xff0c;用户…

MySQL-表的约束

文章目录 一、空属性二、默认值三、zerofill四、列描述五、主键删除主键追加主键复合主键根据主键快速索引 六、自增长last_insert_id() 七、唯一键八、外键class表&#xff08;主表&#xff09;student表&#xff08;从表&#xff09; 一、空属性 之前我们将表的机构&#xff…

单例模式java

并发的有序性会导致返回空指针 class A{private static volatil A a;private A(){}public A getInstance(){if(anull){synchronized(A.class){if(anull)anew A();}}return a; }anew A();这条语句&#xff0c;他需要&#xff1a;开辟空间&#xff0c;初始化空间&#xff0c;指针…

python热门面试题三

面试题1&#xff1a;Python中的列表推导式是什么&#xff1f;请给出一个例子。 回答&#xff1a; 列表推导式&#xff08;List Comprehension&#xff09;是Python中一种非常强大且简洁的构建列表的工具。它允许你通过一个表达式来创建一个新的列表&#xff0c;这个表达式定义…

无显卡也可以玩大模型-MiniGPT-4篇

MiniGPT-4学习 1.Colab上部署MiniGPT-42.论文摘要3.模型架构4.模型训练5.总结 1.Colab上部署MiniGPT-4 代码&#xff1a; https://github.com/Czi24/Awesome-MLLM-LLM-Colab/blob/master/MLLM/MiniGPT-4-colab/MiniGPT-4.md 2.论文摘要 最近的 GPT-4 展示了非凡的多模式能力&…

【设计模式之美】【建造型】工厂模式:通过面向接口编程思路,串起业务流程

文章目录 一. 简单工厂&#xff08;Simple Factory&#xff09;第一种简单工厂&#xff1a;面向接口编程与工厂类&#xff1a;划分功能职责第二种&#xff1a;单例简单工厂&#xff1a;节省内存和对象创建的时间 二. 工厂方法&#xff08;Factory Method&#xff09;&#xff1…

文心一言:如何备考软考架构师

提问&#xff1a;软考高级:架构师指导&#xff0c;有哪些考点、重点考点有哪些&#xff1f;需要如何备考&#xff1f;案例分析题如何做&#xff1f;论文如何写&#xff1f; 文心一言回答1700字如下&#xff1a; 针对软考高级架构师的考试&#xff0c;以下是对考点、重点考点、备…

DiffusionModel-Transformer知识回顾

论文链接&#xff1a; Attention Is All You Need CNN vs RNN vs Transformer CNN&#xff08;卷积神经网络&#xff09; 特点&#xff1a; 局部连接&#xff1a;每个卷积神经元只与输入数据的局部区域连接&#xff0c;这有助于捕捉局部特征。权重共享&#xff1a;卷积核的权重…

Android笔记:Constructor (xxx) has been changed after generation.

遇到此报错时&#xff0c;onstructor (xxx) has been changed after generation.是因为修改了实体类字段后什么都不修改的话就会报这个错 这条信息是关于代码生成和代码变更的警告。当你使用某些工具&#xff08;如注解处理器、代码生成库等&#xff09;来自动生成代码时&…

运行在Linux上的程序越来越慢的排查思路

1、通过free -h 排查内存使用情况&#xff0c;是否内存满了 2、通过df -h 排查磁盘的使用情况&#xff0c;磁盘是否没有空间了 3、检查系统资源配置情况&#xff0c;比如使用ulimit -a检查当前会话的资源限制&#xff0c;如最大文件数、打开文件描述符数等&#xff0c;看是否…

清华计算几何-ConvexHull(凸包)-求极点InTriangle/ToLeft Test

ConvexHull(凸包) 凸包是什么 凸包是计算几何一个非常基础核心的概念。我理解的凸包就是给定一个点集合, 最外围的点的包围体就是凸包。如下所示: 极点(ExtremityPoint) 给定的点集合中, 如果一个点存在一条直线, 让其他所有点都在于该直线的同一侧, 则该点为极点。 非极点 …

如何理解electron 的预加载脚本

在 Electron 应用中,预加载脚本(Preload Script)是一个非常重要的概念,它允许你在渲染进程(web 页面)和主进程之间创建一个安全的桥梁。预加载脚本运行在 Node.js 环境中,但位于渲染进程的一个单独的上下文中,这意味着它可以访问 Node.js 的 API,但无法直接访问 DOM。…

JavaScript进阶(7) ----构造函数和原型对象

目录 构造函数 prototype 定义&#xff1a; 使用场景&#xff1a; constructor 使用场景&#xff1a; 原型proto 原型链 定义 特点 instanceof 运算符 原型继承的基本概念 在JavaScript中&#xff0c;构造函数和原型是面向对象编程的核心概念&#xff0c;它们共同构…

海康工业相机驱动

1.新建基于对话框的MFC程序&#xff0c;界面布局如下 2.修改控件ID&#xff0c;为控件绑定变量 3.创建全局变量&#xff0c;构造函数中初始化变量&#xff0c;初始化对话框界面&#xff0c;补齐各控件按钮响应函数 全文程序如下&#xff1a; // MFC_GrabimageDlg.h : 头文件 /…

【动态规划Ⅰ】斐波那契、爬楼梯、杨辉三角

动态规划—斐波那契系列 什么是动态规划斐波那契数组相关题目509. 斐波那契数 Easy1137. 第 N 个泰波那契数 Easy 杨辉三角118. 杨辉三角 Easy 爬楼梯相关题目70. 爬楼梯 Easy746. 使用最小花费爬楼梯 Easy 什么是动态规划 动态规划是一种通过将原问题分解为相对简单的子问题来…

linux下解压命令

在Linux下&#xff0c;解压缩文件通常涉及多种命令&#xff0c;具体取决于文件的压缩格式。以下是一些常用的解压缩命令&#xff1a; tar.gz / .tgz 如果文件扩展名为 .tar.gz 或 .tgz&#xff0c;你可以使用 tar 命令来解压缩&#xff1a; tar -xzf filename.tar.gz这里的 -x …

近期几首小诗汇总-生活~卷

生活 为生活飘零&#xff0c;风雨都不阻 路见盲人艰&#xff0c;为她心点灯 贺中科大家长论坛成立十五周年 科学家园有喜贺 园外丑汉翘望中 曾一学子入我科 正育科二盼长大 憧憬也能入此家 与科学家论短长 园外翘首听高论 发现有隙入此坛 竟然也能注册成 入园浏览惶然立 此贴…

系统架构的基础:定义、原则与发展历程

目录 1. 系统架构的定义 2. 系统架构的基本组成部分 2.1 架构层次 2.2 架构视图 2.3 架构原则 3. 系统架构的发展历程 3.1 初期阶段:单体架构(Monolithic Architecture) 3.2 面向对象和组件化阶段 3.3 客户端-服务器架构(Client-Server Architecture) 3.4 三层架…

在 Linux 上使用 lspci 命令查看 PCI 总线硬件设备信息

lspci 命令用于显示 Linux 系统上的设备和驱动程序 当在个人电脑或服务器上运行 Linux 时&#xff0c;有时需要识别该系统中的硬件。lspci 命令用于显示连接到 PCI 总线的所有设备&#xff0c;从而满足上述需求。该命令由 pciutils 包提供&#xff0c;可用于各种基于 Linux 和…

JAVA中的回溯算法解空间树,八皇后问题以及骑士游历问题超详解

1.回溯算法的概念 回溯算法顾名思义就是有回溯的算法 回溯算法实际上一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”返回&#xff0c;尝试别的路径。回溯法是一种选优搜索法&#xff…