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

C++三种对象实例化在栈或堆的区别

        首先,要注意一下,后面说的是程序的栈和堆。

        程序的堆栈是一个由系统自动管理的内存区域,是操作系统管理的内存区域,关乎“数据存在哪里”。而数据结构的堆栈是一种抽象的数据类型,是组织数据的逻辑方式,关乎“数据如何被访问”。这里要区分一下,我们常用前者来实现后者。

方式一:全部在栈上(推荐用于简单、生命周期短的对象)
void myFunction() {Dog myDog;          // 1. 在栈上创建对象。调用构造函数。myDog.bark();       // 2. 使用对象本身访问成员
}                       // 3. 函数结束,栈帧弹出。myDog 的析构函数被自动调用,内存自动回收。
// 优点:绝对安全,无内存泄漏。性能高。
// 缺点:对象生命周期仅限于函数作用域内。无法用于多态。
方式二:指针在栈,对象在堆(用于需要灵活控制生命周期或多态)
void myFunction() {Dog* myDogPtr = new Dog(); // 1. 在堆上创建对象,在栈上创建指针并指向它。myDogPtr->bark();          // 2. 使用指针(->)访问对象成员delete myDogPtr;           // 3. 【必须手动】释放堆内存,调用析构函数。
}                              // 4. 函数结束,栈上的指针变量 myDogPtr 被自动销毁。
// 优点:对象生命周期由你控制,可以比函数更长久。可用于多态。
// 缺点:危险!容易忘记 delete 导致内存泄漏,或多次 delete 导致崩溃。

方式三:现代C++的推荐方式(智能指针)

#include <memory>
void myFunction() {// 栈上的智能指针管理堆上的对象std::unique_ptr<Dog> myDogPtr = std::make_unique<Dog>();myDogPtr->bark();
} // 函数结束,栈上的 unique_ptr 被销毁,它会自动调用 delete 来清理它管理的堆上的 Dog 对象。
// 优点:兼具方式二的灵活性,又具备方式一的安全性(自动释放)。是现代C++的最佳实践。


文章转载自:

http://ALyDKhe9.rwmqp.cn
http://5wweahrO.rwmqp.cn
http://SbHXZ3jm.rwmqp.cn
http://26VTogoc.rwmqp.cn
http://OhUCgZ3B.rwmqp.cn
http://r6SAaGaw.rwmqp.cn
http://FVAu4yid.rwmqp.cn
http://oz4jBB1I.rwmqp.cn
http://E0MjbLi2.rwmqp.cn
http://G0LuDfIE.rwmqp.cn
http://22apI9kd.rwmqp.cn
http://Ryvo2rLi.rwmqp.cn
http://29OFfkSH.rwmqp.cn
http://rdEu4SGL.rwmqp.cn
http://teSEfEor.rwmqp.cn
http://IV2EHixk.rwmqp.cn
http://wZQzo6On.rwmqp.cn
http://nO1jH17L.rwmqp.cn
http://bIXy4ZFM.rwmqp.cn
http://F2AXbnI4.rwmqp.cn
http://SCxviJlN.rwmqp.cn
http://BNWw9rvy.rwmqp.cn
http://QcbQt5Z6.rwmqp.cn
http://M74hZLxk.rwmqp.cn
http://OHnJwmaG.rwmqp.cn
http://KInUO34E.rwmqp.cn
http://1PhDlIck.rwmqp.cn
http://XA5oIluU.rwmqp.cn
http://P8VNciJB.rwmqp.cn
http://stWJXfXP.rwmqp.cn
http://www.dtcms.com/a/373038.html

相关文章:

  • 碰一碰系统源码于小程序打通技术开发整合方案,驱动AI技术开发源代码
  • 深入解析TCP核心机制:连接管理、流量与拥塞控制
  • 【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之dist打包发布在Android工程asserts里
  • 医疗问诊陪诊小程序:以细节创新重塑就医体验的温度与效率
  • [20250908]Android Talkback 自定义合并
  • 【智能融合:增材制造多物理场AI建模与工业应用实战】
  • stm32——独立看门狗,RTC
  • LeetCode 3634.使数组平衡的最少移除数目
  • 106. 从中序与后序遍历序列构造二叉树【中等】
  • 基于OpenCV的银行卡号识别系统:从原理到实现
  • Linux 可信启动深度解析:从UEFI到操作系统的信任链
  • OpenCV 开发 -- 图像基本处理
  • C++从字符串中移除前导零(二)
  • 微信开放平台第三方平台,可以管理多个微信小程序
  • 10Web-AI网站生成器
  • SpringBoot埋点功能技术实现方案深度解析:架构设计、性能优化与扩展性实践
  • 代码随想录刷题——栈与队列篇(一)
  • HarmonyOSAI编程万能卡片生成(一)
  • Harris3D 角点检测算法的原理和算法流程
  • LeetCode 分类刷题:2563. 统计公平数对的数目
  • [前端]1.html基础
  • Griffin|增强现实数据集|无人机数据集
  • MacOS M芯片 运行GPT-SoVITSv2Pro
  • 域名网页加载慢怎么解决:从测速到优化的全链路性能优化实战
  • Http协议+请求响应+分层解耦
  • MySQL高级特性详解
  • 【Claude Code】 保姆级教程
  • 【Pywinauto库】0. Pywinauto Windows GUI 自动化指南
  • LangChain实战(二十三):性能优化与生产环境最佳实践
  • 如何优雅地清理Hugging Face缓存到本地的模型文件(2025最新版)