c++ 函数内对象的释放

server/2024/10/8 18:23:10/
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


http://www.ppmy.cn/server/48937.html

相关文章

深入理解并打败C语言难关之一————指针(3)

前言&#xff1a; 昨天把指针最为基础的内容讲完了&#xff0c;并且详细说明了传值调用和传址调用的区别&#xff08;这次我也是做到了每日一更&#xff0c;感觉有好多想写的但是没有写完&#xff09;&#xff0c;下面不多废话&#xff0c;下面进入本文想要说的内容 目录&#…

Linux内存从0到1学习笔记(8.16 SMMU详解)---更新中

写在前面 前面博客已经了解过。SMMU是IOMMU在ARM架构上的实现。主要为了解决虚拟化环境中&#xff0c;GuestOS无法直接将连续的物理地址分配给硬件的问题。对于Hypervisor/GuestOS的虚拟化系统来说&#xff0c;所有的VM都运行在Hypervisor上&#xff0c;每一个VM独立运行一个O…

Docker快速部署springboot项目

本文概述 本文主要介绍了怎么将springboot项目打包为docker镜像&#xff0c;并如何在后端服务器上使用docker快速部署springboot应用和nginx应用。 一、打包springboot项目 1、复制原来的application.yml文件然后重命名为application-pro.yml文件&#xff0c;将application-pro…

8个常用的辅助函数!!

在开发各种项目时&#xff0c;我们会发现经常需要一些辅助函数来帮助我们实现一些需求&#xff0c;并且这些函数是在很多项目里都可以进行复用的。下面我就列出我们一些常用的辅助函数&#xff0c;来帮助大家在开发项目时&#xff0c;进行复用。 1. 首字母大写 将字符串的第一…

web前端翻页:技术探秘与未来趋势

web前端翻页&#xff1a;技术探秘与未来趋势 Web前端翻页&#xff0c;作为网页交互体验的重要组成部分&#xff0c;始终吸引着开发者的关注。其设计原理、实现技巧以及未来趋势&#xff0c;都是我们在探索前端技术时不可忽视的方面。本文将从四个方面、五个方面、六个方面和七…

另辟蹊径的终端防病毒

在数字时代的浪潮中&#xff0c;网络安全问题愈发凸显&#xff0c;防病毒成为了保护信息安全的重要一环。而白名单作为一种有效的安全策略&#xff0c;在防病毒方面发挥着不可或缺的作用。 首先&#xff0c;我们需要明确白名单的概念。白名单是一种管理和安全实践&#xff0c;用…

2024-06-14 ubuntu 简单易用的文本编辑器nano 一些常用方法

一、在嵌入式ubuntu系统下使用vm命令乱码&#xff0c;不得不用nano。 二、Nano 一词源自“纳米”&#xff0c;是一个前缀&#xff0c;用于表示十亿分之一 (10^-9) 的数量级&#xff0c;强调了编辑器的轻量和简洁性质。 三、Nano 是一个简单易用的文本编辑器&#xff0c;适用于…

【机器人和人工智能——自主巡航赛项】基础篇

文章目录 基础培训模块安装电池、接口使用使用注意事项ROS基础培训 功能测试实践运动控制测试激光雷达建图测试导航测试视觉功能测试 讲解视频其余篇章 基础培训 模块安装 安装视频 电池、接口使用 使用注意事项 1、在箱子里取机器时双手请放在前后轮胎间位置抬起&#xff…