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

c++ 函数内对象的释放

void someFunction() {MyClass obj = MyClass();
}void someFunction() {MyClass obj = new MyClass();}void someFunction() {MyClass* obj = new MyClass(); 
}void someFunction() {std::unique_ptr<MyClass> obj = std::make_unique<MyClass>(); 
}在函数中用这4种方式内存会不会在函数结束后释放,有啥差异
void someFunction() {  MyClass obj;  
}

在这个例子中,obj 是一个局部对象,它在栈上被创建和分配内存。当 someFunction 函数结束时,obj 的生命周期结束,它的析构函数会被自动调用,其占用的内存(在栈上)也会被自动释放。

void someFunction() {  MyClass obj = new MyClass(); // 这是错误的  
}

这个代码实际上是有问题的,因为 new MyClass() 返回一个指向 MyClass 对象的指针,但这里尝试将其赋值给一个 MyClass 类型的对象,而不是指针。这会导致编译错误。如果正确的写法是使用指针(如下一个例子所示),则内存不会在函数结束时自动释放。new关键字会在堆上分配内存并返回一个指向新分配的内存的指针,因此你不能将它赋值给一个对象,而应该赋值给一个指针。

void someFunction() {  MyClass* obj = new MyClass();   
}

在这个例子中,obj 是一个指向 MyClass 对象的指针,该对象在堆上通过 new 运算符被创建和分配内存。当 someFunction 函数结束时,obj 指针本身(在栈上)会被销毁,但它所指向的对象在堆上的内存并不会被自动释放。这会导致内存泄漏,除非你在函数外部或其他地方显式地使用 delete obj; 来释放内存。

void someFunction() {  std::unique_ptr<MyClass> obj = std::make_unique<MyClass>();   
}

在这个例子中,obj 是一个 std::unique_ptr 类型的智能指针,它拥有(unique ownership)一个通过 std::make_unique() 在堆上创建的 MyClass 对象。当 someFunction 函数结束时,obj(在栈上)的生命周期结束,它的析构函数会被自动调用。由于 std::unique_ptr 管理着其指向的对象的生命周期,所以它会确保在析构时自动调用 delete 来释放堆上的内存,从而防止了内存泄漏。

总结:

第一种方式(局部对象)会在函数结束时自动释放内存(在栈上)。
第二种方式(错误的赋值)会导致编译错误。
第三种方式(裸指针)不会在函数结束时自动释放内存(在堆上),需要手动释放。
第四种方式(智能指针)会在函数结束时自动释放内存(在堆上),通过智能指针的析构函数

用new,在堆中分配了内存,堆上的内存分配,亦称动态内存分配
https://blog.csdn.net/ytusdc/article/details/88621223

相关文章:

  • Django序列化器详解:普通序列化器与模型序列化器的选择与运用
  • 如何将ai集成到项目中,方法二
  • 【C++】map和set
  • 打造专属 Switch 模拟游戏机
  • MySQL时间和日期类型详解(零基础入门篇)
  • 关于Mysql 中 Row size too large (> 8126) 错误的解决和理解
  • Vue待学习
  • YOLOv8改进 | 注意力机制 | 正确的 Self-Attention 与 CNN 融合范式,性能速度全面提升【独家创新】
  • 秋招突击——第三弹——Java的SSN框架快速入门——SpringMVC
  • 搭建WWW服务
  • 设计模式之服务定位模式
  • 【机器学习】神经网络与深度学习:探索智能计算的前沿
  • 以太坊网络中为什么要设置Gas上限
  • 从零手写实现 nginx-23-nginx 对于 cookie 的操作
  • mysql的索引可以分为哪些类型
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • golang 发送GET和POST示例
  • JSONP原理
  • Laravel 实践之路: 数据库迁移与数据填充
  • leetcode-27. Remove Element
  • php中curl和soap方式请求服务超时问题
  • tweak 支持第三方库
  • Web标准制定过程
  • 从零开始学习部署
  • 高性能JavaScript阅读简记(三)
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 前端知识点整理(待续)
  • 浅谈web中前端模板引擎的使用
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 新版博客前端前瞻
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • zabbix3.2监控linux磁盘IO
  • #window11设置系统变量#
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (k8s)kubernetes 部署Promehteus学习之路
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (转)视频码率,帧率和分辨率的联系与区别
  • .net core 连接数据库,通过数据库生成Modell
  • .net core使用ef 6
  • .net 获取url的方法
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET6 命令行启动及发布单个Exe文件
  • .Net中间语言BeforeFieldInit
  • :如何用SQL脚本保存存储过程返回的结果集
  • @FeignClient注解,fallback和fallbackFactory
  • [ NOI 2001 ] 食物链
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [2023-年度总结]凡是过往,皆为序章
  • [AutoSar NVM] 存储架构
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn