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

new语法

在C++中,new 是用于动态内存分配的操作符,允许在运行时请求内存空间。以下是 new 的完整语法和用法说明:

1. 基本语法

1.1 单一对象分配
type* pointer = new type(initializer);
  • 作用:分配一个 type 类型的对象,并返回指向该对象的指针。
  • 初始化
    • 若省略 (initializer),对象默认初始化(基本类型值未定义,类类型调用默认构造函数)。
    • 使用 () 进行值初始化(基本类型初始化为0,类类型调用默认构造函数)。
    • 使用 (value) 进行直接初始化。

示例

int* p = new int(42);       // 初始化为42
std::string* s = new std::string("hello");  // 调用string构造函数
double* d = new double();   // 值初始化为0.0
1.2 数组分配
type* array = new type[size];  // 分配size个元素的数组
  • 初始化
    • 基本类型元素值未定义。
    • 使用 new type[size]() 进行值初始化(所有元素为0或默认值)。

示例

int* arr = new int[5];         // 未初始化的数组
int* arr2 = new int[5]();      // 所有元素初始化为0
std::string* strs = new std::string[3];  // 调用3次string默认构造函数
1.3 多维数组分配

对于二维数组,常见两种方式:

// 方法一:非连续内存(指针数组)
int** matrix = new int*[rows];
for (int i = 0; i < rows; i++) {matrix[i] = new int[cols];
}// 方法二:连续内存
int* matrix = new int[rows * cols];  // 手动计算索引

2. 定位new(Placement New)

允许在已分配的内存块上构造对象:

void* memory = operator new(sizeof(type));  // 分配原始内存
type* obj = new(memory) type(initializer);  // 在memory上构造对象
  • 用途:自定义内存管理、实现内存池等。
  • 注意:需手动调用析构函数,不释放内存:
    obj->~type();  // 手动调用析构函数
    

3. 初始化方式对比

语法效果
new int默认初始化(值未定义)
new int()值初始化(0)
new int(42)直接初始化为42
new int[5]数组元素默认初始化(值未定义)
new int[5]()数组元素值初始化为0
new int[5]{1,2}列表初始化(C++11+,剩余元素补0:{1,2,0,0,0}

4. 异常处理

  • 内存不足:默认情况下,若内存分配失败,new 抛出 std::bad_alloc 异常。
  • 不抛异常版本:使用 std::nothrow 参数,失败时返回 nullptr
    int* p = new (std::nothrow) int;
    if (p == nullptr) {// 内存分配失败处理
    }
    

5. 与 delete 的配对使用

  • 单一对象:使用 delete
    int* p = new int(42);
    delete p;  // 释放内存并调用析构函数
    
  • 数组:使用 delete[]
    int* arr = new int[5];
    delete[] arr;  // 释放整个数组,必须用[]
    
  • 定位new:手动调用析构函数,不使用 delete
    obj->~type();  // 仅调用析构函数,内存由用户管理
    

6. 智能指针与RAII(推荐做法)

为避免内存泄漏,优先使用智能指针管理动态内存:

#include <memory>// 单一对象
std::unique_ptr<int> p(new int(42));  // 自动释放// 数组(C++14+)
std::unique_ptr<int[]> arr(new int[5]());  // 自动释放// 使用make_unique(C++14+)
auto p2 = std::make_unique<int>(42);  // 更安全的创建方式

7. 常见错误

  1. 内存泄漏:忘记调用 deletedelete[]
  2. 双重释放:多次释放同一块内存。
  3. 悬空指针:释放内存后仍使用指针。
  4. 混用 deletedelete[]:对数组使用 delete 会导致未定义行为。

总结

场景语法示例释放方式
单一对象int* p = new int(42);delete p;
数组int* arr = new int[5];delete[] arr;
定位newT* obj = new(mem) T();obj->~T();
智能指针(单一对象)std::unique_ptr<int> p(new int);自动释放
智能指针(数组)std::unique_ptr<int[]> arr(new int[5]);自动释放

合理使用 new 和智能指针,遵循 RAII 原则,可有效避免内存管理问题。

相关文章:

new语法

在C中&#xff0c;new 是用于动态内存分配的操作符&#xff0c;允许在运行时请求内存空间。以下是 new 的完整语法和用法说明&#xff1a; 1. 基本语法 1.1 单一对象分配 type* pointer new type(initializer);作用&#xff1a;分配一个 type 类型的对象&#xff0c;并返回…...

npm、yarn幽灵依赖问题

很好&#xff01;我们来专门讲讲**幽灵依赖&#xff08;Phantom Dependency&#xff09;**是什么&#xff0c;以及为什么 pnpm 对这个问题非常严格。 &#x1f47b; 什么是幽灵依赖&#xff1f; 幽灵依赖&#xff08;Phantom Dependency&#xff09;&#xff0c;指的是&#x…...

Android Native 之 adbd进程分析

目录 1、adbd守护进程 2、adbd权限降级 3、adbd命令解析 1&#xff09;adb shell 2&#xff09;adb root 3&#xff09;adb reboot 4、案例 1&#xff09;案例之实现不需要执行adb root命令自动具有root权限 2&#xff09;案例之实现不需要RSA认证直接能够使用adb she…...

CAN通讯协议中各种参数解析

1.各种参数缩写 2.多帧传输时间参数解析 - Sender&#xff08;左侧&#xff09; 指的是 多帧数据的发送者&#xff0c;也就是&#xff1a; ECU&#xff08;被测系统 / 响应方&#xff09; - Receiver&#xff08;右侧&#xff09; 指的是 多帧数据的接收者&#xff0c;也就是…...

网络攻防技术三:网络脆弱性分析

文章目录 一、影响安全的因素二、计算机网络三、网络体系结构脆弱性1、因特网容易被攻击的特性 四、典型网络协议安全性分析&#xff08;重要&#xff09;1、IPv42、RIP&#xff08;UDP)3、ICMP(UDP)4、ARP5、OSPF(IP数据报&#xff09;6、BGP(TCP)7、UDP8、TCP9、DNS(UDP)10、…...

(八)登录认证与学生写作画像

本次将赵昱琨同学之前完成的学生写作画像与智能学习路径规划的后端与目前已有的后端框架进行整合。同时为了实现学生写作画像与智能学习路径规划&#xff0c;需要在之前简易的登录系统上进行重构&#xff0c;所以本次大规模重写了登录模块&#xff0c;同时发现很多过去冗余的代…...

Netty学习example示例

文章目录 simpleServer端NettyServerNettyServerHandler Client端NettyClientNettyClientHandler tcp&#xff08;粘包和拆包&#xff09;Server端NettyTcpServerNettyTcpServerHandler Client端NettyTcpClientNettyTcpClientHandler protocolcodecCustomMessageDecoderCustomM…...

几种常用的Agent的Prompt格式

一、基础框架范式&#xff08;Google推荐标准&#xff09; 1. 角色与职能定义 <Role_Definition> 你是“项目专家”&#xff08;Project Pro&#xff09;&#xff0c;作为家居园艺零售商的首席AI助手&#xff0c;专注于家装改造领域。你的核心使命&#xff1a; 1. 协助…...

数据库运维管理系统在AI方向的实践

引言 关系型数据库(如MySQL、PostgreSQL、SQL Server、Oracle等)作为核心数据存储平台,承载着关键业务系统的运行。数据库的运维管理(DBA)工作变得愈发复杂和重要,涉及性能监控、故障诊断、容量规划、安全审计、自动化运维等多个方面。传统的数据库运维依赖人工经验,效…...

[RoarCTF 2019]Easy Calc

查看源代码 <!--Ive set up WAF to ensure security.--> <script>$(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content").val()),type:GET,success:function(data){$("#result").html(<div …...

[Windows]在Win上安装bash和zsh - 一个脚本搞定

目录 前言安装步骤配置要求下载安装脚本启动程序 前言 Windows是一个很流行的系统, 但是在Windows上安装bash和zsh一直是一个让人头疼的问题. 本蛙特意打包了一个程序, 用于一站式解决这一类的问题. 安装步骤 配置要求 系统: Windows软件: Powershell 5.1或以上 下载安装…...

ubuntu系统上运行jar程序输出时间时区不对

springboot项目打包jar文件在ubuntu系统上运行&#xff0c;发现在系统和日志里面&#xff0c;显示和打印的当前时间时区都是UTC0&#xff0c;通过timedatectl命令设置系统时区为Asia/Shanghai&#xff0c;命令date -R发现系统已经修改成功&#xff0c;但是发现springboot仍然输…...

React 播客专栏 Vol.18|React 第二阶段复习 · 样式与 Hooks 全面整合

视频版 &#x1f399; 欢迎回到《前端达人 React播客书单》第 18 期。 今天&#xff0c;我们将对第二阶段的内容进行系统复盘&#xff0c;重点是两个关键词&#xff1a;样式 与 Hooks。 样式&#xff0c;决定组件“长什么样”Hooks&#xff0c;决定组件“怎么动起来” 我们不但…...

从认识AI开始-----解密LSTM:RNN的进化之路

前言 我在上一篇文章中介绍了 RNN&#xff0c;它是一个隐变量模型&#xff0c;主要通过隐藏状态连接时间序列&#xff0c;实现了序列信息的记忆与建模。然而&#xff0c;RNN在实践中面临严重的“梯度消失”与“长期依赖建模困难”问题&#xff1a; 难以捕捉相隔很远的时间步之…...

leetcode0513. 找树左下角的值-meidum

1 题目&#xff1a;找树左下角的值 官方标定难度&#xff1a;中 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 示例 2: 输入: [1,2,3,4,null,5,6,null,null,7]…...

命令行式本地与服务器互传文件

文章目录 1. 背景2. 传输方式2.1 SCP 协议传输2.2 SFTP 协议传输 3. 注意 命令行式本地与服务器互传文件 1. 背景 多设备协同工作中&#xff0c;因操作系统的不同&#xff0c;我们经常需要将另外一个系统中的文件传输到本地PC进行浏览、编译。多设备文件互传&#xff0c;在嵌入…...

MPTCP 聚合吞吐

只破不立假把式&#xff0c;前面连续喷 MPTCP 是个错误&#xff0c;今天说说如何克服。 到底谁在阻碍 MPTCP 聚合吞吐一定要搞清楚&#xff0c;是算法硬伤&#xff0c;是数据不足。前文说过&#xff0c;将一个窗口内的数据多路径 spray 有损吞吐&#xff0c;想要聚合吞吐&…...

JavaScript性能优化实战技术文章大纲

代码层面优化 避免全局变量污染&#xff0c;使用let和const替代var&#xff0c;减少作用域链查找开销。 // 反例&#xff1a;全局变量 var globalVar 低效;// 正例&#xff1a;局部变量 function optimized() {const localVar 高效; }减少DOM操作&#xff0c;合并多次操作或…...

LabelImg: 开源图像标注工具指南

LabelImg: 开源图像标注工具指南 1. 简介 LabelImg 是一个图形化的图像标注工具&#xff0c;使用 Python 和 Qt 开发。它是目标检测任务中最常用的标注工具之一&#xff0c;支持 PASCAL VOC 和 YOLO 格式的标注输出。该工具开源、免费&#xff0c;并且跨平台支持 Windows、Lin…...

计算机网络 TCP篇常见面试题总结

目录 TCP 的三次握手与四次挥手详解 1. 三次握手&#xff08;Three-Way Handshake&#xff09; 2. 四次挥手&#xff08;Four-Way Handshake&#xff09; TCP 为什么可靠&#xff1f; 1. 序列号与确认应答&#xff08;ACK&#xff09; 2. 超时重传&#xff08;Retransmis…...

树欲静而风不止,子欲养而亲不待

2025年6月2日&#xff0c;13~26℃&#xff0c;一般 待办&#xff1a; 物理2 、物理 学生重修 职称材料的最后检查 教学技能大赛PPT 遇见&#xff1a;使用通义创作了一副照片&#xff0c;很好看&#xff01;都有想用来创作自己的头像了&#xff01; 提示词如下&#xff1a; A b…...

Kotlin中的::操作符详解

Kotlin提供了::操作符&#xff0c;用于创建对类或对象的成员(函数、属性)的引用。这种机制叫做成员引用(Member Reference)。这是Kotlin高阶函数和函数式编程的重要组成部分。 简化函数传递 在Java中&#xff0c;我们这样传方法&#xff1a; list.forEach(item -> System.…...

【Linux】(1)—进程概念-③Linux进程概念与PCB

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Linux进程概念与PCB 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 什么是进程&#xff1f; 进程可以理解为"正在执行的…...

神经网络中的梯度消失与梯度爆炸

在深层次的神经网络中很容易出现梯度消失与梯度爆炸的问题。这篇博客就详细介绍一下为什么会产生梯度消失与梯度爆炸的问题&#xff0c;以及如何解决。 首先梯度是什么 类比快递员送包裹&#xff1a; 神经网络训练时&#xff0c;需要根据预测错误&#xff08;损失函数&#…...

深入详解编译与链接:翻译环境和运行环境,翻译环境:预编译+编译+汇编+链接,运行环境

目录 一、翻译环境和运行环境 二、翻译环境&#xff1a;预编译编译汇编链接 &#xff08;一&#xff09;预处理&#xff08;预编译&#xff09; &#xff08;二&#xff09;编译 1、词法分析 2、语法分析 3、语义分析 &#xff08;三&#xff09;汇编 &#xff08;四&…...

系统架构设计师案例分析----经典架构风格特点

这次的考试太大意了&#xff0c;很多知识点有印象&#xff0c;但不能完整的描述出来。今年11月的考试&#xff0c;要认真备考&#xff0c;从现在开始&#xff0c;把案例分析和论文内容整理出来&#xff0c;一是方便记忆&#xff0c;二是和各位考一起分享。欢迎各位拍砖。 这段…...

基于大模型的急性乳腺炎全病程风险预测与综合治疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与技术路线 二、急性乳腺炎概述 三、大模型技术原理与应用现状 3.1 大模型基本原理 3.2 在医疗领域的应用案例 3.3 选择大模型用于急性乳腺炎预测的依据 四、大模型预测急性乳腺炎各阶段风险 4.…...

HTML实战:爱心图的实现

设计思路 使用纯CSS创建多种风格的爱心 添加平滑的动画效果 实现交互式爱心生成器 响应式设计适应不同设备 优雅的UI布局和色彩方案 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <meta nam…...

定时任务:springboot集成xxl-job-core(二)

定时任务实现方式&#xff1a; 存在的问题&#xff1a; xxl-job的原理&#xff1a; 可以根据服务器的个数进行动态分片&#xff0c;每台服务器分到的处理数据是不一样的。 1. 多台机器动态注册 多台机器同时配置了调度器xxl-job-admin之后&#xff0c;执行器那里会有多个注…...

DeviceNET转EtherCAT网关:医院药房自动化的智能升级神经中枢

在现代医院药房自动化系统中&#xff0c;高效、精准、可靠的设备通信是保障患者用药安全与效率的核心。当面临既有支持DeviceNET协议的传感器、执行器&#xff08;如药盒状态传感器、机械臂限位开关&#xff09;需接入先进EtherCAT高速实时网络时&#xff0c;JH-DVN-ECT疆鸿智能…...