C++ 创建并初始化对象
创建并初始化C++对象
当我们创建一个C++对象时,它需要占用一些内存,即使我们写一个完全为空的类,类中没有成员,什么也没有,它至少也要占用一个字节的内存。但是我们类中有很多成员,它们需要存储在某地方,当我们决定开始使用这个对象时,我们会创建一堆变量,对象有一堆变量,我们需要在电脑的某个地方分配内存,这样我们就可以记住这些变量设置的值。
应用程序会将内存主要分为两部分,栈和堆,还有其他部分的内存,比如源代码的区域。
在C++中我们要选择对象要放在哪里,对象是在栈上还是在堆上创建,它们有不同的功能差异。
栈:栈对象有一个自动的生存期,他们的生存期实际上是由它声明的地方的作用域决定的,只要变量超出作用域,也就是说内存被释放了,因为当作用域结束的时候,栈会弹出作用域里面的东西,栈上的任何东西会被释放。
堆:一旦在堆中分配一个对象,实际上你已经在堆上创建了一个对象,它会一直待在那里,直到你做出决定,确定不需要它,想要释放这个对象,那怎末处理这段内存都行。
代码案例:
在栈上创建:
在什么时候在栈上创建对象?
几乎所有的时候,如果你能像这样在栈上创建对象,那就像这样创建对象,因为这是C++中最快的方法,也是可以管控的方法,去初始化对象
某些情况下不能这么做的原因?
1、如果将实例化对象放到main函数的生存期外
void Function(){int a = 2;Entity entity;}
一旦到达函数结尾的花括号,这个entity会从内存中被销毁
当我们在main函数中调用Function时,就为这个函数创建了一个栈结构,它包含了我们声明的所有局部变量,其中包括基本类型,也包括我们的类和对象,当函数结束时,栈帧会被销毁,即栈上所有的内存,所有创建的变量都消失了
如果想让括号{}内的实例化对象在作用域之外依然存在,就不能分配到栈上,需要使用堆分配。
2、如果entity的规模太大,可能有太多的entity,可能没有足够的空间在栈上分配,因为栈通常非常小,通常是1M/2M
# include <iostream>
# include <string>
using namespace std;class Entity
{
private:string m_Name; //只有一个成员,是一个字符串
public:Entity() : m_Name("Unknown") {}Entity(const string& name) : m_Name(name) {}const string& GetName() const { return m_Name; }
};int main()
{// 1、在栈上创建Entity entity; // 实际上调用了默认构造函数Entity() : m_Name("Unknown")cout << entity.GetName() << endl;Entity entity1("chen");// 等价于 Entity entity1 = Entity("chen")cout << entity1.GetName() << endl;/*在什么时候在栈上创建对象?几乎所有的时候如果你能像这样在栈上创建对象,那就像这样创建对象,因为这是C++中最快的方法,也是可以管控的方法,去初始化对象某些情况下不能这么做的原因?1、如果将实例化对象放到main函数的生存期外void Function(){int a = 2;Entity entity;}一旦到达这个花括号,这个entity会从内存中被销毁当我们调用Function时,就为这个函数创建了一个栈结构,它包含了我们声明的所有局部变量,其中包括基本类型,也包括我们的类和对象,当函数结束时,栈帧会被销毁,即栈上所有的内存,所有创建的变量都消失了Entity* e;{Entity entity2("cherno");e = &entity2;cout << entity2.GetName() << endl;} 一旦出了{}作用域,就到达了栈端,entity2对象就已经不存在了如果想让括号{}内的实例化对象在作用域之外依然存在,就不能分配到栈上,需要使用堆分配cin.get();return 0;
}
在堆上创建:
在堆上创建,首先要做的就是在改变类型,将Entity改成Entity*,通过new关键字,这里最大的区别不是那个类型变成了指针,而是new关键字,new关键字是关键。
Entity* entity = new Entity("cherno");当我们调用new Entity时,会在栈上分配内存,调用构造函数,这个new Entity实际上会返回一个Entity*,它会返回entity在堆上被分配的内存地址。
使用new关键字必须调用delete释放内存
delete + 变量名:delete entity;
性能问题:在堆上分配要比栈花费更长的时间,而且在堆上分配的话,您必须手动释放被分配的内存
# include <iostream>
# include <string>
using namespace std;class Entity
{
private:string m_Name; //只有一个成员,是一个字符串
public:Entity() : m_Name("Unknown") {}Entity(const string& name) : m_Name(name) {}const string& GetName() const { return m_Name; }
};int main()
{// 2、在堆上创建/*在堆上创建,首先要做的就是在改变类型,将Entity改成Entity*,通过new关键字,这里最大的区别不是那个类型变成了指针,而是new关键字,new关键字是关键当我们调用new Entity时,会在栈上分配内存,调用构造函数,这个new Entity实际上会返回一个Entity*,它会返回entity在堆上被分配的内存地址*/Entity* entity = new Entity("cherno");//释放内存//delete 变量名;delete entity;/*性能问题:在堆上分配要比栈花费更长的时间,而且在堆上分配的话,您必须手动释放被分配的内存*/cin.get();return 0;
}
创建对象的两种方法,如何选择?
如果对象太大,或者需要显示地控制对象的生存期,那就是用堆创建,其他情况就是用栈创建。
相关文章:
C++ 创建并初始化对象
创建并初始化C对象 当我们创建一个C对象时,它需要占用一些内存,即使我们写一个完全为空的类,类中没有成员,什么也没有,它至少也要占用一个字节的内存。但是我们类中有很多成员,它们需要存储在某地方&#…...
大数据可视化python01
import pandas as pd import matplotlib.pyplot as plt# 设置中文改写字体 plt.rcParams[font.sans-serif] [SimHei]# 读取数据 data pd.read_csv(C:/Users/wzf/Desktop/读取数据进行数据可视化练习/实训作业练习/瓜果类单位面积产量.csv ,encoding utf-8)#输出 print(data)…...
Java底层自学大纲_分布式篇
分布式专题_自学大纲所属类别学习主题建议课时(h)A 分布式锁001 Zookeeper实现分布式锁l-常规实现方式2.5A 分布式锁002 Zookeeper实现分布式锁II-续命&超时&羊群效应问题解决方案2.5A 分布式锁003 Zookeeper实现分布式锁III-基于Curator框架实现…...
Thread多线程(创建,方法,安全,通信,线程池,并发,并行,线程的生命周期)【全详解】
目录 1.多线程概述 2.多线程的创建 3.Thread的常用方法 4.线程安全 5.线程同步 6.线程通信 7.线程池 8.其它细节知识:并发、并行 9.其它细节知识:线程的生命周期 1.多线程概述 线程是什么? 线程(Thread)是一个程序内部的一条执行…...
自定义View中的ListView和ScrollView嵌套的问题
当我们在使用到ScrollView和ListView的时候可能会出现显示不全的问题。那我们可以进行以下分析 ScrollView在测量子布局的时候会用UNSPECIFIED。通过源码观察, 在ScrollView的onMeasure方法中 Overrideprotected void onMeasure(int widthMeasureSpec, int heightMe…...
支持向量机 SVM | 线性可分:硬间隔模型公式推导
目录 一. SVM的优越性二. SVM算法推导小节概念 在开始讲述SVM算法之前,我们先来看一段定义: 支持向量机(Support VecorMachine, SVM)本身是一个二元分类算法,支持线性分类和非线性分类的分类应用,同时通过OvR或者OvO的方式可以应用…...
【Unity实战】UGUI和Z轴排序那点事儿
如果读者是从Unity 4.x时代过来的,可能都用过NGUI这个插件(后来也是土匪成了正规军),NGUI一大特点是可以靠transform位移的Z值进行遮挡排序,然而这个事情在UGUI成了难题(Sorting Layer、Inspector顺序等因素…...
Vue/React 前端高频面试
说一说vue钩子函数 钩子函数是Vue实例创建和销毁过程中自动执行的函数。按照组件生命周期的过程分为:挂载阶段 -> 更新阶段 -> 销毁阶段。 每个阶段对应的钩子函数分别为:挂载阶段(beforeCreate,created,befor…...
[技巧]Arcgis之图斑四至范围批量计算
ArcGIS图层(点、线、面三类图形)四至范围计算 例外一篇介绍:[技巧]Arcgis之图斑四至点批量计算 说明:如下图画出来的框(范围标记不是很准) ,图斑的x最大和x最小,y最大,…...
C/C++工程师面试题(STL篇)
STL 中有哪些常见的容器 STL 中容器分为顺序容器、关联式容器、容器适配器三种类型,三种类型容器特性分别如下: 1. 顺序容器 容器并非排序的,元素的插入位置同元素的值无关,包含 vector、deque、list vector:动态数组…...
Effective Programming 学习笔记
1 基本语句 1.1 断言 在南溪看来,断言可以用来有效地确定编程中当前代码运行的前置条件,尤其是以下情况: 第三方工具库对输入数据的依赖,例如:minitouch库对Android版本的要求...
【MGR】MySQL Group Replication 背景
目录 17.1 Group Replication Background 17.1.1 Replication Technologies 17.1.1.1 Primary-Secondary Replication 17.1.1.2 Group Replication 17.1.2 Group Replication Use Cases 17.1.2.1 Examples of Use Case Scenarios 17.1.3 Group Replication Details 17.1…...
300分钟吃透分布式缓存-17讲:如何理解、选择并使用Redis的核心数据类型?
Redis 数据类型 首先,来看一下 Redis 的核心数据类型。Redis 有 8 种核心数据类型,分别是 : & string 字符串类型; & list 列表类型; & set 集合类型; & sorted set 有序集合类型&…...
思科网络设备监控
思科是 IT 行业的先驱之一,提供从交换机到刀片服务器的各种设备,以满足中小企业和企业的各种 IT 管理需求。管理充满思科的 IT 车间涉及许多管理挑战,例如监控可用性和性能、管理配置更改、存档防火墙日志、排除带宽问题等等,这需…...
深入剖析k8s-控制器思想
引言 本文是《深入剖析Kubernetes》学习笔记——《深入剖析Kubernetes》 正文 控制器都遵循K8s的项目中一个通用的编排模式——控制循环 for {实际状态 : 获取集群中对象X的实际状态期望状态 : 获取集群中对象X的期望状态if 实际状态 期望状态 {// do nothing} else {执行…...
go并发模式之----使用时顺序模式
常见模式之二:使用时顺序模式 定义 顾名思义,起初goroutine不管是怎么个先后顺序,等到要使用的时候,需要按照一定的顺序来,也被称为未来使用模式 使用场景 每个goroutine函数都比较独立,不可通过参数循环…...
[动态规划]---part1
前言 作者:小蜗牛向前冲 专栏:小蜗牛算法之路 专栏介绍:"蜗牛之道,攀登大厂高峰,让我们携手学习算法。在这个专栏中,将涵盖动态规划、贪心算法、回溯等高阶技巧,不定期为你奉上基础数据结构…...
java 关于 Object 类中的 wait 和 notify 方法。(生产者和消费者模式!)
4、关于 Object 类中的 wait 和 notify 方法。(生产者和消费者模式!) 第一:wait 和 notify 方法不是线程对象的方法,是 java 中任何一个 java 对象都有的方法,因为这两个方法是 Object 类中自带的。 wait 方…...
YOLOv8姿态估计实战:训练自己的数据集
课程链接:https://edu.csdn.net/course/detail/39355 YOLOv8 基于先前 YOLO 版本的成功,引入了新功能和改进,进一步提升性能和灵活性。YOLOv8 同时支持目标检测和姿态估计任务。 本课程以熊猫姿态估计为例,将手把手地教大家使用C…...
【海贼王的数据航海:利用数据结构成为数据海洋的霸主】链表—双向链表
目录 往期 1 -> 带头双向循环链表(双链表) 1.1 -> 接口声明 1.2 -> 接口实现 1.2.1 -> 双向链表初始化 1.2.2 -> 动态申请一个结点 1.2.3 -> 双向链表销毁 1.2.4 -> 双向链表打印 1.2.5 -> 双向链表判空 1.2.6 -> 双向链表尾插 1.2.7 -&…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
