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

如何使用new和delete操作符进行动态内存分配和释放?

在C++中,new 和 delete 操作符用于在堆(heap)上动态地分配和释放内存。这是管理内存的一种重要方式,特别是在需要创建可变数量或生命周期与程序执行流程不一致的对象时。

使用 new 进行动态内存分配

当你使用 new 操作符时,它会分配足够的内存来存储指定类型的对象,并返回指向该对象的指针。如果内存分配成功,则可以使用该指针来访问和操作该对象。如果内存分配失败(例如,由于内存不足),则 new 会抛出一个 std::bad_alloc 异常。

示例:

 

cpp复制代码

int* p = new int; // 分配一个int大小的内存,并返回指向它的指针
*p = 42; // 使用指针来访问和修改该内存中的值

对于类对象,你也可以使用 new 来分配内存并调用构造函数:

 

cpp复制代码

class MyClass {
public:
MyClass(int value) : data(value) {}
// ... 其他成员和函数 ...
private:
int data;
};
MyClass* obj = new MyClass(10); // 分配内存并调用构造函数

使用 delete 进行动态内存释放

当你使用 new 分配了内存后,应该在适当的时候使用 delete 操作符来释放它。delete 会调用对象的析构函数(如果有的话),并释放该对象占用的内存。

示例:

 

cpp复制代码

int* p = new int;
// ... 使用p指向的内存 ...
delete p; // 释放内存,并调用int的析构函数(但int没有析构函数)
p = nullptr; // 将指针设置为nullptr,避免悬挂指针(dangling pointer)问题

对于类对象,delete 会自动调用析构函数:

 

cpp复制代码

MyClass* obj = new MyClass(10);
// ... 使用obj指向的对象 ...
delete obj; // 释放内存,并调用MyClass的析构函数
obj = nullptr; // 避免悬挂指针问题

注意事项

  • 避免悬挂指针:在使用 delete 释放内存后,最好将指针设置为 nullptr,以避免悬挂指针问题。悬挂指针是指已经被 delete 释放但仍然指向原内存地址的指针。
  • 避免重复释放:不要对同一个指针多次使用 delete,这会导致未定义的行为。
  • 注意内存泄漏:如果你忘记使用 delete 来释放使用 new 分配的内存,就会发生内存泄漏。确保每个 new 都有对应的 delete
  • 考虑使用智能指针:C++11引入了智能指针(如 std::unique_ptr 和 std::shared_ptr),它们可以自动管理内存的生命周期,从而减少内存泄漏的风险。

相关文章:

  • 《C语言》文件操作
  • 细说MCU修改回调函数调用模式的方法
  • 爬虫可以不必自己写,使用ChatGPT编写抓取电影评论数据脚本
  • leetcode198 打家劫舍
  • VBA实现关闭Excel自动计算,关闭屏幕刷新
  • 我的创作纪念日(1825天)
  • OrangePi AIpro小试牛刀-目标检测(YoloV5s)
  • docker 容器 network host 模式启动
  • 揭开 Docker 容器的神秘面纱:深入理解容器原理
  • vue3+ele-plus+sortableJs对el-table使用sortableJs插件对表格拖拽时限定某列或某行不允许拖拽
  • 八股操作系统和计算机网络
  • van-list 遇到的问题
  • JavaScript 深拷贝和浅拷贝的实现、使用场景和存在的问题
  • 国产MCU芯片(2):东软MCU概览
  • 股指期货功能
  • 07.Android之多媒体问题
  • Apache Spark Streaming 使用实例
  • Computed property XXX was assigned to but it has no setter
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Laravel5.4 Queues队列学习
  • Linux后台研发超实用命令总结
  • mysql中InnoDB引擎中页的概念
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Odoo domain写法及运用
  • Python进阶细节
  • SSH 免密登录
  • vue:响应原理
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 计算机在识别图像时“看到”了什么?
  • 理清楚Vue的结构
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 学习使用ExpressJS 4.0中的新Router
  • 智能合约开发环境搭建及Hello World合约
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #define,static,const,三种常量的区别
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (2)MFC+openGL单文档框架glFrame
  • (70min)字节暑假实习二面(已挂)
  • (c语言)strcpy函数用法
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (十)c52学习之旅-定时器实验
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法