c++只在堆和只在栈上创建对象

【KDD2024】ShapeFormer:用于多元时间序列分类的Shapelet Transformer 多元时间序列分类(MTSC)因其在现实世界中的广泛应用而吸引了大量研究关注。最近,Transformer在MTSC中取得了先进的性能。然而, 阅读详情

首先,分享一篇讲解的很详细的文章:https://blog.youkuaiyun.com/hxz_qlh/article/details/13135433

其次,说下这里面涉及到的一些基础知识:c++的内存分配,类的成员函数的访问修饰符。

  1. 对象在内存中可以存储在堆上也可以存储在栈上。静态建立的对象在栈上,好处是栈空间的申请效率高(编译器有直接处理的指令),操作系统会帮助管理变量的内存,当超出作用域后会被直接析构掉,不用担心内存泄漏的问题。但是栈空间比较小,一般在10M以内,这个值也可以手动调整,Linux环境中`uname -s`可以查看。
  2. 动态建立的对象在堆上。对象的内存资源由程序员控制,自己控制什么时候去释放。和上一种的区别是:变量的生命周期是可控的,不会因为作用域的原因而被释放(如果忘记释放就会出现内存泄漏的问题)。
  3. 当使用静态建立对象的方法即`Test test;`,编译器会在栈空间上申请出Test类的一块空间,并且将类的析构函数注册进来,当该对象退出作用域后,析构掉test对象的栈空间。当动态建立对象的时候`Test* test = new Test();`,new是一个操作符号(和+-符号一样),会先申请出来一个空间,然后再调用class的构造函数进行构造。这个对象一直在内存上,直到有程序员调用了delete才会释放调这个空间。可以发现,创建对象的时候都避不开构造函数和析构函数,所以可以采用设置构造函数和析构函数的访问可见性来控制对象是生成在栈上还是堆上。

如果想让对象只能在堆上,那可以将类的析构函数设置成私有的,当有人想要创建对象在栈上的时候就会失败,因为操作系统找不到对应的析构函数(不要将构造函数也做成私有的,因为创建对象在堆上的时候也要调用构造函数的,除非想要做成单例的样子)。这样只能去new对象到堆上了,但是由于析构函数是私有的,程序员仍然需要自己设置析构功能的函数,并记得调用,防止出现内存泄漏的情况。下面是例子,值得注意的是,构造和析构函数被设置成了protected的,是为了能够正常的继承。create函数被设置成static的是为解决外部无法发现构造函数,需要有一个可以被外部访问到的接口去调用。

class A
{
protected:
    A(){}
    ~A(){}
public:
    static A* create()
    {
        return new A();
    }
    void destory()
    {
        delete this;
    }
};

如果想让对象只能在栈上,那就是不能让别人使用到new这个操作符。可以在class中重载了私有的成员函数new,而且delete也需要一起重载下。如下面的例子:

class A
{
private:
    void* operator new(size_t t){}     // 注意函数的第一个参数和返回值都是固定的
    void operator delete(void* ptr){} // 重载了new就需要重载delete
public:
    A(){}
    ~A(){}
};

 

全国青少年信息素养大赛图形化(Scratch)编程考点总结 阅读详情

相关推荐

保姆级教程:用NILMTK和REDD数据集,5分钟跑通你的第一个负荷分解模型

本文提供了一份详细的NILMTK和REDD数据集负荷分解模型教程,适合零基础用户快速上手。从环境准备、数据获取到模型构建和评估,全程仅需5分钟即可完成。特别适合希望快速入门非侵入式负荷分解(NILM)的开发者,涵盖数据预处理、模型训练及结果可视化等关键步骤。

weixin_30493401的博客 442

java基础

1.有基本类型,为什么还需要包装类型? 8种基本类型 装箱:把基本类型转换为对应的包装类型 Integer a = Integer.valueOf(1); 拆箱:包装转基本 int b = a.intValue(); java是面对对象,而基本类型不具备面向对象的特性 id是Interger判断是否有值null id是int类型判断是否为0,麻烦 2.== 与 equeals区别 ==是用来判断两个变量之间的值是否相等,变量可以分为基本数据类型,引用类型(包装类型) 如果是基本数据类型的变量直接比...

qq_41482600的博客 261

知识图谱初步学习(一)——本体+Protege新手学习

文章目录前言(本体详解)1.本体概念2.本体分类3.本体组成4.本体构建方法一、protege简介二、软件使用步骤1.安装2.使用三、问题解决方案汇总 前言(本体详解) 在开始学习知识图谱的过程中,首先就是要了解什么是本体(ontology)。 1.本体概念 本体的概念最初源自于哲学领域,在哲学中的定义为“对世界上客观事物的系统描述,即存在论”。哲学中的本体关心的是客观现实的抽象本质。而在计算机领域,本体是可以在语义的层次上来对知识进行描述,可以看做是某一个领域知识的通用模型。 本体是从客观世界中抽象出来

qq_43654669的博客 3万+

C++栈上创建对象和堆上创建对象

一、在栈(Stack)上创建对象 Student是一个类,创建一个实例化对象: Student stu; 下面进行创建对象指针的操作(非必须): 上面代码中创建的对象 stu 在栈上分配内存,需要使用&获取它的地址: Student *pStu = &stu; pStu 是一个对象指针,它指向 Student 类型的数据,也就是通过 Student 创建出来的对象。 二、...

保持写作习惯,完成知识沉淀 1027

深入MIPI DSI显示技术栈 (三) DSI vs CSI-2:孪生协议的本质差异

MIPI协议中的DSI与CSI-2存在本质差异:DSI为输出导向协议(Host→Display),用于屏幕控制和画面传输;CSI-2为输入导向协议(Sensor→Host),专攻图像采集。二者在包结构、同步机制、物理层优化等方面均有显著区别:DSI支持命令包和BLLP包,CSI-2具备嵌入式数据包;DSI时钟模式以Burst为主,CSI-2支持Continuous模式。典型场景中,二者协同工作(如手机相机预览),需注意时序同步和延迟控制。设计混合系统时,需合理规划虚拟通道和物理层资源,充分发挥这对&quot

GateWorld的博客 2106

瑞芯微RK3568开发板实战:Android11系统parameter.txt文件配置全解析(附常见问题排查)

本文深入解析了瑞芯微RK3568开发板在Android 11系统下parameter.txt文件的配置要点与实战技巧。作为BootLoader启动阶段的核心蓝图,该文件决定了硬件初始化、分区布局及电源管理。文章详细拆解了身份标识、GPIO控制(PWR_HLD)、命令行参数及分区表等关键字段的配置逻辑,并针对RK3568平台与Android 11特性提供了专项适配策略,最后附带了启动失败、分区异常等常见问题的深度排查方法。

php55的博客 896

javascript 中的 this几种情况

全局的 this(浏览器) console.log(this.document === document); //true console.log(this === window); //true this.a = 37; // 相当于创建了一个全局变量 a console.log(window.a); //37 一般函数的 this(浏览器) function f1() { return this; } f1() === window; //true, global object 这里在浏览器

桃子阿桃 578

麒麟系统下的多媒体革命:VLC在kylinV10上的性能优化与调试技巧

本文详细介绍了在麒麟kylinV10系统上优化VLC多媒体播放性能的实战技巧,特别针对飞腾FT-2000/4硬件平台。从源码编译调优到硬件加速配置,提供全面的性能提升方案,帮助开发者在国产操作系统上构建高效媒体播放环境。

weixin_29168675的博客 457

c++创建对象的2种方法,以及其中的区别(堆、栈)

C++在创建对象的时候可以采用两种方式:(例如类名为Test) Test test 或者 Test* pTest = new Test()。

m0_37635769的博客 1811

Vue3 - 详细实现微信公众号H5网页内置浏览器中预览下载word文档(doc)、excel表格(xls)、ppt文稿、pdf文档等文件,微信内部直接打开预览和下载到本地教程,安卓苹果手机无差异兼容

vue3,nuxt3,微信公众号,h5,移动端,网页,网站,vue微信内置浏览器下载文件,下载文件,在微信浏览器里面实现下载任意文件,H5需要在微信浏览器中下载excel文件,实现网页在微信内置浏览器中下载文件详细教程,安卓点击下载会提示打开浏览器,后端返回流文件,如何解决无法下载文件,跳转至浏览器下载文件,发送到电脑微信,安卓,苹果,手机系统,微信H5页面,vue3微信公众号H5网站,内置浏览器下载文档,如何在微信浏览器中预览office文件,word文档,excel文档,pdf文档,ppt文档,offi

🏆 前端领域优质创作者 1万+

22、狭义相对论与曲线坐标空间相关知识解析

本文深入解析了狭义相对论与曲线坐标空间的核心概念,涵盖能量-动量张量的定义与守恒、曲线坐标系下的度量张量与基向量性质、协变与逆变张量的变换规则,并介绍了克里斯托费尔符号与协变导数的计算方法。进一步探讨了在弯曲空间中进行微积分运算的基础理论及其在广义相对论中的关键应用,如爱因斯坦场方程如何描述物质-能量对时空曲率的影响,为理解黑洞等引力现象提供了理论框架。

lambda的博客 116

特殊类的设计

特殊类的设计

GG_Bruse的博客 262

ARM功耗管理软件之DVFS&AVS

思考:功耗管理软件栈及示例?WFI&WFE?时钟&电源树?DVFS&AVS?

AI-安全-功耗 1232

C++ 内存中的堆和栈,在堆和栈上创建对象,new、delete

内存空间中堆和栈的含义与区别,在堆或栈上创建对象的方法,new、delete

weixin_43811423的博客 1484

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【C++】堆创建对象和栈创建对象的区别

当在栈上创建对象时,对象的生命周期由其作用域决定。对象在其所在的代码块(通常是函数或控制结构)中创建,当代码块执行结束时,对象会自动销毁。这意味着栈上创建的对象的生命周期是自动管理的,您不需要手动释放内存。总之,栈上创建的对象的生命周期受其作用域限制,当作用域结束时,对象会自动销毁。而堆上创建的对象的生命周期不受作用域限制,需要手动管理内存。在选择创建对象的方式时,请根据您的需求和编程风格进行选择。这意味着您需要自己管理堆上创建的对象的生命周期。当在堆上创建对象时,对象的生命周期不受其作用域的限制。

qq_46049113的博客 521

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++中在堆中创建对象 和 栈中的不同

在堆中创建的对象 是由程序员来释放的 但是在栈中创建的对象 是由系统自动释放的 构造函数 对象创建时调用 用来申请 内存的 析构函数 是 释放函数的时候调用的函数 用于在释放对象创建所占用的内存。

kokodudu的专栏 866

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++创建对象:栈和堆的区别

首先我们应该了解栈和堆的差别: 详细信息:传送门 栈相当于函数自带的存储空间,在windows下一般为2M,在Linux下一般为8M,存取速度稍微快一点。 堆是系统的空间,相对较大,一般为2G,效率稍微慢一点,不过这点效率差距对于一般程序可以忽略不计。 栈上定义对象一般为类名 对象名,这个过程会调用构造函数,程序结束的时候会调用析构函数,不收程序员控制。 堆上定义对象一般使用new运算符,同时...

T_T233333333的博客 709

【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]

本文是关于特殊类的概述性文章,介绍了四种常见的特殊类:不能被拷贝的类、只能在堆上创建对象的类、只能在栈上创建对象的类以及不能被继承的类。文章详细讨论了它们的实现方法、优缺点和应用场景,并提供了相应的代码示例,帮助读者更好地理解这些特殊类的概念和用法。此外,文章还讨论了C++98和C++11两个版本的编程语言在实现特殊类方面的差异。无论你是初学者还是资深程序员,本文都将为你提供有关特殊类的全面指南。

Yawesh的博客 2008

C++中堆与栈创建对象的区别

在C++中,和是两种不同的内存分配区域,它们在管理方式、生命周期、性能和使用场景上有显著区别。:由编译器自动管理,通过移动栈指针分配/释放。:与作用域绑定(如函数结束时自动释放)。:分配和释放速度极快(仅需调整栈指针)。:栈空间较小(默认几MB,取决于系统/编译器设置)。:无内存碎片。:局部变量、函数参数、返回地址等。:手动管理(需显式调用newmalloc和deletefree:由程序员控制(必须手动释放,否则内存泄漏)。:分配和释放较慢(需操作系统动态管理)。:受系统可用内存限制(通常远大于栈)。

2503_91764102的博客 861

堆和栈的区别

在 上一篇博客中提到过堆和栈,但是堆和 栈的区别 并没有讲清楚    堆和栈的区别:   一、堆栈空间分配区别:   1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;   2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。   二、堆栈缓存方式区别:   1

吸喵高手的小窝 2152

C++中堆、栈数据区别

C++用new来创建对象和非new来创建对象的区别 我们都知道C++中有三种创建对象的方法,如下: #include using namespace std; class A { private: int n; public: A(int m):n(m) { } ~A(){} }; int main() { A a(

xaiojiang的专栏 2038

C++堆还是栈上创建对象

这篇文章来自于一次讨论:http://www.devbean.net/2013/01/qt-study-road-2-model-view/#comment-17532。关于究竟是在堆上还是在栈上创建对象,可能很多初学者感到迷惑。我想可以把这部分内容拿出来详细介绍一下。现在,假设你已经清楚什么是堆,什么是栈。如果需要在堆上创建对象,要么使用new运算符,要么使用malloc系列函数。这点没有异议。...

taoqilin的专栏 1875

C++用new来创建对象和非new来创建对象的区别

C++用new来创建对象和非new来创建对象的区别 我们都知道C++中有三种创建对象的方法,如下: #include using namespace std; class A { private: int n; public: A(int m):n(m) { } ~A(){} }; int main() { A a

qq_22266217的博客 301

C++:在堆上创建对象,还是在栈上?

这篇文章来自于一次讨论:http://www.devbean.net/2013/01/qt-study-road-2-model-view/#comment-17532。关于究竟是在堆上还是在栈上创建对象,可能很多初学者感到迷惑。我想可以把这部分内容拿出来详细介绍一下。现在,假设你已经清楚什么是堆,什么是栈。如果需要在堆上创建对象,要么使用new运算符,要么使用malloc系列函数。这点没有异议。...

Solo_two的博客 2377

c++创建对象(四种方法)和内存分析

四种对象定义方式(in stack、in heap、in global area) https://mintlucas.github.io/2019/02/26/C-简洁的链表创建/ 在C++中,编译器把内存分为三个部分,有四种方法可以产生一个对象。 静态存储区域:主要保存全局变量和静态变量。生存期:整个程序。 堆:存储动态生成的变量。生存期:自己来决定。 栈:存储调用函数相关的变量和...

USTC_Lucas 3252

【零基础学QT】【010】C++中的指针,栈和堆

???? C++中的内存区域 C++中的内存区域包括栈和堆两种,其中栈的空间小效率高,一般不到10M,堆的空间大但效率低,可以大到几个G 为了保证程序整体高效地运行,C++用堆来存储类对象的完整数据,用栈来存放堆对象的地址,局部变量,函数参数和返回值等 通过栈中的地址,我们可以间接访问到堆中的实际对象 ???? 通过new关键字在堆中动态创建对象 在前面的代码中,我们都是通过默认初始化和构造函数的方式来定义变...

天天向上 Up Up Up (*^▽^*) 823
上一篇: c++回调函数和函数指针
下一篇: c++内存布局
hellozmz
博客等级 码龄11年 30粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值