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

[C++] new和delete

  • 使用new时调用构造函数
  • 使用delete时调用析构函数
  1. 构造函数

使用new动态分配内存时,如果分配的是基本类型的内存,则不会调用构造函数。如果分配的是自定义类型的内存,则会调用构造函数进行对象的初始化。

例如:

int* pInt = new int; // 不会调用构造函数
class MyClass {
public:MyClass() {cout << "MyClass constructor is called" << endl;}
};
MyClass* pObj = new MyClass(); // 调用构造函数
  1. 析构函数

使用delete释放内存时,如果内存中存储的是基本类型,或者使用new分配内存时发生了错误,导致没有成功创建对象,则不会调用析构函数;否则会调用析构函数进行资源的释放。

例如:

int* pInt = new int;
// 使用pInt
delete pInt; // 不会调用析构函数class MyClass {
public:MyClass() {cout << "MyClass constructor is called" << endl;}~MyClass() {cout << "MyClass destructor is called" << endl;}
};
MyClass* pObj = new MyClass();
// 使用pObj
delete pObj; // 调用析构函数
pObj = NULL;

需要注意的是,使用new分配的内存必须在不再使用时通过delete操作符进行释放,否则会造成内存泄漏

同时,为了避免悬垂指针的问题,在删除指针之前必须将指针置为nullptr

  • 在C++中,delete只是释放了指针指向的内存空间,但是并没有将指针本身变成nullptr(空指针)。

  • 这也就意味着,如果在delete后不将指针制空,那么这个指针仍然指向之前释放的那块内存空间,访问它将会产生未定义行为(UB)。

因此,在使用delete释放动态分配的内存后,最好将指针置为nullptr,这样能够避免悬垂指针的问题。

例如:

int *pInt = new int;
//使用pInt
delete pInt;
pInt = nullptr; // 将指针置为nullptr

需要注意的是,将指针置为nullptr只是一种好习惯,而非强制要求。如果你后续没有再次使用该指针或者保证没有悬垂指针的风险,那么也可以不进行指针置空操作。

nullptr是C++11引入的关键字。它用于表示空指针常量,可以用于初始化指针或与指针进行比较。

在C++之前的版本中,通常使用NULL或0来表示空指针。然而,这样的表示方式可能会引起一些歧义和问题。为了解决这些问题,并提供更明确和类型安全的空指针表示,C++11引入了nullptr。

使用nullptr可以明确地表示空指针,避免在某些上下文中与整数0混淆。另外,nullptr还可以作为实现函数重载时的重要工具,与其他类型的指针进行区分。

示例用法:

int* pInt = nullptr; // 初始化指针为空
if (pInt == nullptr) {// 执行某些操作
}void foo(int* ptr) {// 实现重载函数
}
void foo(int i) {// 实现重载函数
}foo(nullptr); // 调用第一个foo函数,传递空指针常量

nullptr是C++中的关键字,用于明确表示空指针常量,提高代码的可读性和类型安全性。


要释放通过new申请的数组,需要使用delete[]操作符,而不是简单的delete

示例代码如下:

int* pArray = new int[10]; // 通过new申请一个int类型的数组// 使用pArraydelete[] pArray; // 释放通过new申请的数组内存
pArray = nullptr; // 将指针置为nullptr

需要注意以下几点:

  1. 使用delete[]来释放通过new[]申请的数组内存。
  2. 在释放数组内存之后,将指针置为nullptr是个好习惯,可以避免悬垂指针问题。
  3. 如果使用new[]分配数组时发生了错误,没有成功创建数组对象,那么在释放数组内存时也不要使用delete[],因为没有成功创建的数组对象不需要释放。

总结起来,使用delete[]来释放通过new[]申请的数组内存,并将指针置为nullptr

相关文章:

[C++] new和delete

使用new时调用构造函数使用delete时调用析构函数 构造函数 使用new动态分配内存时&#xff0c;如果分配的是基本类型的内存&#xff0c;则不会调用构造函数。如果分配的是自定义类型的内存&#xff0c;则会调用构造函数进行对象的初始化。 例如&#xff1a; int* pInt new…...

OpenVINS学习2——VIRAL数据集eee01.bag运行

前言 周末休息了两天&#xff0c;接着做上周五那个VIRAL数据集没有运行成功的工作。现在的最新OpenVINS需要重新写配置文件&#xff0c;不像之前那样都写在launch里&#xff0c;因此需要根据数据集情况配置好estimator_config.yaml还有两个标定参数文件。 VIRAL数据集 VIRAL…...

jemeter,断言:响应断言、Json断言

一、响应断言 接口A请求正常返回值如下&#xff1a; {"status": 10013, "message": "user sign timeout"} 在该接口下创建【响应断言】元件&#xff0c;配置如下&#xff1a; 若断言成功&#xff0c;则查看结果树的接口显示绿色&#xff0c;若…...

【vue实战项目】通用管理系统:信息列表,信息的编辑和删除

本文为博主的vue实战小项目系列中的第七篇&#xff0c;很适合后端或者才入门的小伙伴看&#xff0c;一个前端项目从0到1的保姆级教学。前面的内容&#xff1a; 【vue实战项目】通用管理系统&#xff1a;登录页-CSDN博客 【vue实战项目】通用管理系统&#xff1a;封装token操作…...

基于FPGA的视频接口之高速IO(光纤)

简介 对于高速IO口配置光纤,现在目前大部分开发板都有配置,且也有说明,在此根据自己的工作经验以及对于各开发板的说明归纳 通过高速IO接口,以及硬件配置,可以实现对于光纤的收发功能,由于GTX的速率在500Mbs到10Gbps之间,但通道高速io可配置光纤10G硬件,物理通完成,则…...

HTML实现页面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>工商银行电子汇款单</title> </head> &…...

回归预测 | MATLAB实现IWOA-LSTM改进鲸鱼算法算法优化长短期记忆神经网络的数据回归预测(多指标,多图)

回归预测 | MATLAB实现IWOA-LSTM改进鲸鱼算法算法优化长短期记忆神经网络的数据回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现IWOA-LSTM改进鲸鱼算法算法优化长短期记忆神经网络的数据回归预测&#xff08;多指标&#xff0c;多图&#…...

鸿蒙开发之状态管理@State

1、视图数据双向绑定 鸿蒙开发采用的声明式UI&#xff0c;利用状态驱动UI的更新。其中State被称作装饰器&#xff0c;是一种状态管理的方式。 状态&#xff1a;指的是被装饰器装饰的驱动视图更新的数据。 视图&#xff1a;是指用户看到的UI渲染出来的界面。 之所以成为双向…...

redis基本用法学习(主要数据类型)

redis官网教程中介绍有三种方式连接redis&#xff1a;命令行、gui工具和编程连接&#xff1a;   命令行方式主要是在命令行中输入redis-cli后&#xff0c;通过命令方式与redis服务进行交互&#xff0c;支持两种模式&#xff1a;REPL模式&#xff08;简单的交互式的编程环境&a…...

低代码:美味膳食或垃圾食品

低代码开发是近年来迅速崛起的软件开发方法&#xff0c;让编写应用程序变得更快、更简单。有人说它是美味的膳食&#xff0c;让开发过程高效而满足&#xff0c;但也有人质疑它是垃圾食品&#xff0c;缺乏定制性与深度。你认为低代码到底是美味的膳食还是垃圾食品呢&#xff0c;…...

设计模式—观察者模式

观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。 在观察者模式中&#xff0c;有两个核心角色&#xf…...

Java_EasyExcel_导入_导出Java-js

easyExcel导入 从easyexcel官网中拷贝过来&#xff0c;使用到的&#xff0c;这是使用监听器的方法。 EasyExcel.read(file.getInputStream(), BaseStoreDataExcelVo.class, new ReadListener<BaseStoreDataExcelVo>() {/*** 单次缓存的数据量*/public static final int…...

循环神经网络-RNN记忆能力实验 [HBU]

目录 一、循环神经网络 二、循环神经网络的记忆能力实验 三、数据集构建 数据集的构建函数 加载数据并进行数据划分 构造Dataset类 四、模型构建 嵌入层 SRN层 五、模型训练 训练指定长度的数字预测模型 多组训练 损失曲线展示 六、模型评价 参考《神经网络与深度…...

P1044 [NOIP2003 普及组] 栈——卡特兰数

传送门&#xff1a; P1044 [NOIP2003 普及组] 栈 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1044 公式一&#xff1a;递推式(注意开 long long &#xff0c;然后 先乘完再除&#xff0c;防止下取整&#xff09; typedef long long ll;…...

9:00面试,9:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到12月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…...

ets:tab2list的不足之处与替代方法,以及gen_server中使用ets的优缺点

ets:tab2list 是 Erlang/OTP 中的一个函数&#xff0c;用于将 ETS&#xff08;Erlang Term Storage&#xff09;表转换为列表。ETS 是 Erlang 中的一个内建数据库&#xff0c;允许开发者在内存中存储大量数据。 一、ets:tab2list 的不足之处&#xff1a; 性能问题&#xff1a;…...

软件测试之压力测试详解

一、什么是压力测试 软件测试中&#xff1a;压力测试&#xff08;Stress Test&#xff09;&#xff0c;也称为强度测试、负载测试。压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷&#xff0c;长时间或超大负荷地运行测试软件&#xff0c;来测试被测系统的性能、…...

SpringBoot之请求的详细解析

1. 请求 在本章节呢&#xff0c;我们主要讲解&#xff0c;如何接收页面传递过来的请求数据。 1.1 Postman 之前我们课程中有提到当前最为主流的开发模式&#xff1a;前后端分离 在这种模式下&#xff0c;前端技术人员基于"接口文档"&#xff0c;开发前端程序&…...

mac 环境下 goframe安装GF开发工具 gf-cli(安装包方式安装)

mac 环境下 goframe安装GF开发工具 gf-cli&#xff08;安装包方式安装&#xff09; 安装包网址 链接: link 终端输入命令进行安装 ./gf_darwin_amd64 但是产生如下报错&#xff0c;无法安装 使用一下命令给安装权限 chmod 0777 gf_darwin_amd64 && ./gf_darwin_a…...

Navicat 技术指引 | 适用于 GaussDB 分布式的数据迁移工具

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…...

WordPress和VuePress双站点配置指南:如何在单台云服务器上同时运行(基于宝塔面板)

WordPress与VuePress双站点高效部署实战&#xff1a;基于宝塔面板的云服务器资源整合方案 当个人开发者或小型团队需要在有限预算下同时维护动态博客和静态文档站点时&#xff0c;单台云服务器的资源整合能力就显得尤为重要。本文将分享如何通过宝塔面板这一可视化运维工具&…...

微信聊天记录丢了别慌!3步教你用开源工具找回珍贵回忆

微信聊天记录丢了别慌&#xff01;3步教你用开源工具找回珍贵回忆 【免费下载链接】WechatBakTool 基于C#的微信PC版聊天记录备份工具&#xff0c;提供图形界面&#xff0c;解密微信数据库并导出聊天记录。 项目地址: https://gitcode.com/gh_mirrors/we/WechatBakTool …...

教育资源数字化转型:tchMaterial-parser电子课本获取工具深度解析

教育资源数字化转型&#xff1a;tchMaterial-parser电子课本获取工具深度解析 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff0c;让您更方便地获取课本内容。…...

vLLM部署ERNIE-4.5-0.3B-PT的批处理能力实测:batch_size=8时吞吐提升2.3倍

vLLM部署ERNIE-4.5-0.3B-PT的批处理能力实测&#xff1a;batch_size8时吞吐提升2.3倍 当我们需要同时处理多个用户的文本生成请求时&#xff0c;比如一个在线客服系统或者一个内容创作平台&#xff0c;传统的单条请求处理方式就会显得力不从心。服务器只能一个个排队处理&…...

annotated_research_papers:AI研究者的终极论文宝库完全指南

annotated_research_papers&#xff1a;AI研究者的终极论文宝库完全指南 【免费下载链接】annotated_research_papers This repo contains annotated research papers that I found really good and useful 项目地址: https://gitcode.com/gh_mirrors/an/annotated_research_…...

城通网盘下载加速终极解决方案:ctfileGet让你的文件传输速度提升10倍

城通网盘下载加速终极解决方案&#xff1a;ctfileGet让你的文件传输速度提升10倍 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否还在为城通网盘下载速度缓慢而烦恼&#xff1f;每次下载大文件都…...

USART串口通信

一、串口 USART USART&#xff08;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff0c;通用同步 / 异步收发器&#xff09; 是一种全双工、串行、逐位传输的通信接口&#xff0c;核心是把单片机 / 处理器的并行数据转为串行数据发送&#xff0c;或把串行数据…...

RMBG-2.0开源模型教程:微调BiRefNet适配特定行业(如医疗影像标记)

RMBG-2.0开源模型教程&#xff1a;微调BiRefNet适配特定行业&#xff08;如医疗影像标记&#xff09; 1. 项目概述与核心价值 RMBG-2.0&#xff08;BiRefNet&#xff09;是一个基于先进架构开发的图像背景扣除模型&#xff0c;能够精确识别并移除图像背景&#xff0c;保留高质…...

Janus-Pro-7B播客制作:音频波形图识别+内容摘要与章节标记生成

Janus-Pro-7B播客制作&#xff1a;音频波形图识别内容摘要与章节标记生成 1. 引言&#xff1a;播客制作的新思路 播客制作通常需要大量的人工工作&#xff1a;听完整期节目、标记关键章节、撰写内容摘要、制作时间轴标记。这个过程耗时耗力&#xff0c;特别是对于长篇播客内容…...

前端自动化部署终极指南:从CI/CD到容器化的完整流程

前端自动化部署终极指南&#xff1a;从CI/CD到容器化的完整流程 【免费下载链接】all-of-frontend 你想知道的前端内容都在这 项目地址: https://gitcode.com/gh_mirrors/al/all-of-frontend GitHub 加速计划&#xff08;all-of-frontend&#xff09;是一个全面的前端学…...