C++:new 运算符

C++基础 — new的使用 new的使用 阅读详情

简介

从免费存储为 类型 为的对象或对象数组分配内存,并将适当类型的非零指针返回到该对象。

备注

Microsoft c + + 组件扩展提供对 new 关键字的支持,以添加 vtable 槽条目。

语法

[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]

备注

如果不成功,则 new 返回零或引发异常; 可以通过以下方式更改此默认行为:编写自定义异常处理例程,并使用您的函数名称作为其参数调用 _set_new_handler 运行时库函数。

当 new 用于为 c + + 类对象分配内存时,将在分配内存后调用对象的构造函数。

使用 delete 运算符释放用运算符分配的内存 new 。

以下示例先分配然后释放一个二维字符数组,数组的大小为 dim x 10。 在分配多维数组时,除第一个维度之外的所有维度必须是计算结果为正值的常量表达式;最左侧的数组维度可以是计算结果为正值的任何表达式。 当使用运算符分配数组时 new ,第一个维度可为零,运算符将 new 返回唯一的指针。

char (*pchar)[10] = new char[dim][10];
delete [] pchar;

类型名 不能包含 const 、 volatile 、类声明或枚举声明。 因此,以下表达式是非法的:

volatile char *vch = new volatile char[20];

new 运算符不分配引用类型,因为它们不是对象。

new 运算符不能用于分配函数,但它可用于分配指向函数的指针。 下面的示例为返回整数的函数分配然后释放一个包含 7 个指针的数组。

int (**p) () = new (int (*[7]) ());
delete *p;

如果使用 new 不带任何额外参数的运算符,并使用 /Gx、 /eha或 /ehs 选项进行编译,则编译器将在 delete 构造函数引发异常时生成代码来调用运算符。

以下列表描述了的语法元素 new :

虚拟
提供了一种方法,以便在重载时传递其他参数 new 。

类型名称
指定要分配的类型;它可以是内置类型,也可以是用户定义的类型。 如果类型规范非常复杂,则可用括号将其括起来以强制实施绑定顺序。

initializer
为初始化对象提供值。 不能为数组指定初始值设定项。 new 仅当类具有默认构造函数时,运算符才会创建对象的数组。

示例:分配并释放字符数组

下面的代码示例分配类 CName 的一个字符数组和一个对象,然后释放它们。

// expre_new_Operator.cpp
// compile with: /EHsc
#include <string.h>

class CName {
public:
   enum {
      sizeOfBuffer = 256
   };

   char m_szFirst[sizeOfBuffer];
   char m_szLast[sizeOfBuffer];

public:
   void SetName(char* pszFirst, char* pszLast) {
     strcpy_s(m_szFirst, sizeOfBuffer, pszFirst);
     strcpy_s(m_szLast, sizeOfBuffer, pszLast);
   }

};

int main() {
   // Allocate memory for the array
   char* pCharArray = new char[CName::sizeOfBuffer];
   strcpy_s(pCharArray, CName::sizeOfBuffer, "Array of characters");

   // Deallocate memory for the array
   delete [] pCharArray;
   pCharArray = NULL;

   // Allocate memory for the object
   CName* pName = new CName;
   pName->SetName("Firstname", "Lastname");

   // Deallocate memory for the object
   delete pName;
   pName = NULL;
}

示例: new 运算符

如果使用运算符的放置新形式,则 new 除了分配的大小外,具有参数的窗体外, delete 如果构造函数引发异常,则编译器不支持运算符的放置形式。 例如:

// expre_new_Operator2.cpp
// C2660 expected
class A {
public:
   A(int) { throw "Fail!"; }
};
void F(void) {
   try {
      // heap memory pointed to by pa1 will be deallocated
      // by calling ::operator delete(void*).
      A* pa1 = new A(10);
   } catch (...) {
   }
   try {
      // This will call ::operator new(size_t, char*, int).
      // When A::A(int) does a throw, we should call
      // ::operator delete(void*, char*, int) to deallocate
      // the memory pointed to by pa2.  Since
      // ::operator delete(void*, char*, int) has not been implemented,
      // memory will be leaked when the deallocation cannot occur.

      A* pa2 = new(__FILE__, __LINE__) A(20);
   } catch (...) {
   }
}

int main() {
   A a;
}

初始化使用 new 运算符分配的对象

运算符的语法中包含一个可选的 " 初始值设定项 " 字段 new 。 这样就可以使用用户定义的构造函数来初始化新对象。 下面的示例演示如何将初始化表达式与运算符一起使用 new :

// expre_Initializing_Objects_Allocated_with_new.cpp
class Acct
{
public:
    // Define default constructor and a constructor that accepts
    //  an initial balance.
    Acct() { balance = 0.0; }
    Acct( double init_balance ) { balance = init_balance; }
private:
    double balance;
};

int main()
{
    Acct *CheckingAcct = new Acct;
    Acct *SavingsAcct = new Acct ( 34.98 );
    double *HowMuch = new double ( 43.0 );
    // ...
}

在此示例中, CheckingAcct 使用运算符分配对象 new ,但未指定任何默认初始化。 因此,调用了类的默认构造函数 Acct()。 然后,以相同的方式分配了对象 SavingsAcct,只不过将它显式初始化为 34.98。 由于34.98 的类型为 double ,因此将调用采用该类型的参数的构造函数来处理初始化。 最后,将非类类型 HowMuch 初始化为 43.0。

如果对象属于类类型,并且该类具有如下所示的构造函数 (如前面的示例所示) ,则 new 仅当满足以下条件之一时,运算符才能初始化对象:

初始值设定项中提供的自变量与构造函数的自变量一致。

该类有一个默认构造函数(可在没有参数的情况下调用的构造函数)。

使用运算符分配数组时,不能进行显式的每个元素初始化 new ; 仅调用默认构造函数(如果存在)。

如果内存分配失败 (运算符 new 返回值 0) ,则不执行初始化。 这可防止尝试初始化不存在的数据。

与函数调用一样,未定义初始化表达式的计算顺序。 此外,您不应指望这些表达式能在执行内存分配前完全计算。 如果内存分配失败且 new 运算符返回零,则初始值设定项中的某些表达式可能无法完全计算。

使用 new 运算符分配的对象的生存期

用运算符分配的对象在 new 其定义的作用域被退出时不会被销毁。 由于 new 运算符返回指向它所分配的对象的指针,因此程序必须定义一个具有适当范围的指针来访问这些对象。 例如:

// expre_Lifetime_of_Objects_Allocated_with_new.cpp
// C2541 expected
int main()
{
    // Use new operator to allocate an array of 20 characters.
    char *AnArray = new char[20];

    for( int i = 0; i < 20; ++i )
    {
        // On the first iteration of the loop, allocate
        //  another array of 20 characters.
        if( i == 0 )
        {
            char *AnotherArray = new char[20];
        }
    }

    delete [] AnotherArray; // Error: pointer out of scope.
    delete [] AnArray;      // OK: pointer still in scope.
}

在上面的示例中,指针 AnotherArray 一旦超出范围,将无法再删除对象。

new 的工作方式

分配表达式(包含运算符的表达式 new )执行三个操作:

定位并保留要分配的对象的存储。 此阶段完成后,将分配正确的存储量,但它还不是对象。

初始化对象。 初始化完成后,将为成为对象的已分配存储显示足够的信息。

返回一个指针,该指针指向从 新类型名称 或 类型名称 派生的指针类型的对象 () 。 程序使用此指针来访问最近分配的对象。

new 运算符调用函数 new。 对于任何类型的数组和不属于 class 、或类型的对象, struct union 将调用全局函数 :: operator new 来分配存储。 类类型的对象可以基于每个类定义自己的 运算符 new 静态成员函数。

当编译器遇到 new 用于分配类型 类型的 对象的运算符时,将发出对 type :: operator new ( sizeof ( 的调用 type ) ) ,或者,如果未定义用户定义的 运算符 new ,则 :: operator new ( sizeof ( type ****) ) 。 因此, new 操作员可以为对象分配正确的内存量。

备注

Operator new 的参数的类型为 size_t 。 此类型在、、、、、、、和中定义 <direct.h> <malloc.h> <memory.h> <search.h> <stddef.h> <stdio.h> <stdlib.h> <string.h> <time.h> 。

语法中的选项允许 放置 规范 (参阅 new Operator) 的语法。 位置 参数仅可用于 运算符 new 的用户定义实现;它允许将额外信息传递给 new 运算符。 T *TObject = new ( 0x0040 ) T; T *TObject = T::operator new( sizeof( T ), 0x0040 ); 如果类 T 具有成员运算符 new,则具有位置字段(如)的表达式转换为,否则转换为 T *TObject = ::operator new( sizeof( T ), 0x0040 ); 。

放置 字段的原始目的是允许在用户指定的地址分配硬件相关的对象。

备注

虽然上面的示例仅在 " 位置 " 字段中显示一个参数,但并不限制可通过这种方式将多少个额外参数传递给 运算符 。

即使为类类型定义了 new 运算符 ,也可以使用此示例的形式来使用全局运算符:

T *TObject =::new TObject;

范围解析运算符 (:😃 强制使用全局 new 运算符。

该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处,本文章博客地址:https://blog.youkuaiyun.com/it_cplusplus/article/details/118835106

C++中的new运算符:探索就地、普通和无抛异常new的用法 本文深入探讨了C++中标准提供的三种new运算符的变体:就地new、普通new和无抛异常的new,及其在特定类中的使用和重载。同时,分析了名称隐藏对全局new运算符的影响,以及如何在派生类中避免隐藏全局new运算符。... 阅读详情

相关推荐

基于IC动态加权的机器学习多因子选股策略:从模型融合到实战回测

在量化投资领域,多因子选股模型通过挖掘市场数据中的有效信号来预测股票收益。其核心原理在于利用统计学与机器学习算法,从海量因子中识别出与未来收益具有稳定相关性的特征。这一技术的核心价值在于将主观投资决策转化为系统化、可重复的客观过程,从而在控制风险的前提下追求超额收益。其典型应用场景包括股票阿尔法策略构建、Smart Beta产品设计以及资产配置中的股票筛选环节。本文聚焦于如何通过信息系数(IC)这一关键指标,动态融合Ridge回归、MLP神经网络和随机森林等多个预测模型,构建一个能够自适应市场风格轮动的选股

weixin_34216614的博客 451

【C++】C++中的new关键字用法详解

C++new用法详解

qq_35902025的博客 5万+

APM水下机器人实战:从零搭建高精度自主航行系统

本文详细介绍了如何基于开源APM飞控及其水下分支ArduSub,从零搭建高精度自主水下航行器。核心在于集成双天线RTK模块实现厘米级定位与精确航向,并配合MAVROS与ROS构建自主控制系统。文章涵盖了硬件选型、软件配置、自主逻辑开发及水池调试的全流程实战经验,为水下机器人爱好者与研究者提供了一套完整的自主航行系统解决方案。

app77的博客 512

C++ new关键字详解

一.new的基本用法 1.c++通过new关键字进行动态分配内存。 2.new开辟的空间存储在堆上,而我们定义的变量存储在栈上。 3.new分配的空间使用delete释放,new[] 使用 delete[]。 4. int* pi = new int(5);//表示动态分配一个int ,初始化为 5 int* pa = new int[5];//表示动态分配一个数组,数组大小为5 ...

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 2万+

评价模型——层次分析法(AHP)与熵权法(EWM)

层次分析法是定性与定量结合的多准则决策、评价方法。将决策的有关元素分解成目标层、准则层和方案层,并通过人们的判断对决策方案的优劣进行排序,在此基础上进行定性和定量分析。它把人的思维过程层次化、数量化,并用数学为分析、决策、评价、预报和控制提供定量的依据。

好好学习 天天向上 2万+

400G光模块测试全攻略:从PCS层到CMIS合规的避坑指南

本文为网络设备测试工程师和光通信研发人员提供了一份详尽的400G光模块测试实战指南。文章深入剖析了从PCS层信号完整性、FEC容限到CMIS管理接口合规性测试的全流程,并分享了ANLT协议分析、SerDes眼图调试以及系统级流量压力测试中的核心技巧与常见避坑点,旨在帮助读者构建一套高效、精准的测试体系,确保高速光模块的可靠性与性能。

weixin_29300931的博客 212

C++中运算符new的深入讲解

本人深入讲解了C++中运算符new的使用方法

_Santiago的博客 9596

DESeq2差异分析结果不会看?用这个R脚本5分钟生成发表级火山图和热图

本文详细介绍了如何使用R语言快速可视化DESeq2差异分析结果,5分钟内生成可直接用于论文发表的火山图和热图。通过解析DESeq2数据结构、展示ggplot2和EnhancedVolcano包的绘图技巧,以及pheatmap包的热图定制方法,帮助研究者高效呈现差异表达基因分析结果。

weixin_30326515的博客 340

C++:new的用法

虽然对象1及3的空间被回收,但对象1与3并未析构!这一点将时刻提醒我们使用定位new需要自己显式调用析构函数,完成对象的析构!显然,如果类动态地为其成员分配内存,这将引发问题!,所以,当我们使用定位new创建对象必须自己保证不会覆盖任何不想丢失的数据!new只申请内存空间,相当于malloc,delete相当于free。1.new operator(初始化对象=申请内存空间+内存定位)换句话说就是,现在空间已经有了,不需要。在已有的空间上调用构造函数构造对象而已。指向的对象位于内存缓冲区,该空间并不是。

qq_39200110的博客 1万+

倍福--实现TCP/IP的配置

控制器为CX5120,需要和上位机做通信,选择TCP/IP的通讯方式,本文介绍TCP/IP通信的操作步骤。 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制软件 3 1.2. 串口调试助手 3 1.2.1. TCP调试通信助手 3 授权文件 3 2.1 Lib文件 3 2.2. CAB文件 4 PLC程序编写 4 3.1. 引入TCP/IP库文件 4 3.2. Client端程序 5 3.2.1. 建立相关变量 5 3.3.2. 编写连接功能块

weixin_41883890的博客 5730

《二、企业级监控系统之Prometheus监控node_exporter》

文章目录一、部署node_exporter服务二、部署prometheus服务2.1、部署node_exporter服务三、grafana之添加数据源四、grafana之导入监控模板五、grafana之修改模板变量六、grafana之修改仪表板变量总结 > 这里是引用 一、部署node_exporter服务 docker run -d --restart=always --name node_exporter --net=“host” --pid=“host” -v “/:/host:ro,

东城绝神 1万+

C++训练营:new 运算符

你还在苦苦寻找 new 运算符的使用方法吗?这篇文章教会你如何使用 new 运算符,让你知道 new 运算符也就不过如此!

Austin的博客 710

【Unity的HDRP渲染管线下用Steam VR串流结合使用遇到的各种问题_SteamVR 插件和Pico串流助手】

当你启用"Mock Runtime"选项后,Unity将模拟一个虚拟的OpenXR运行时环境,并提供一些虚拟的设备和功能,让你能够进行开发和调试。在Unity中,SteamVR插件是一个由Valve提供的Unity插件,它允许开发者在Unity项目中集成SteamVR功能,以便支持SteamVR设备。OpenXR是一个跨平台的虚拟和增强现实(VR/AR)开发接口,它为开发者提供了一个统一的接口,用于访问不同VR/AR硬件设备和平台的功能。这个选项是用于模拟OpenXR运行时环境的功能。

暴走约伯的博客 2800

C++:new 运算符

new 运算符 //每日心得:独上高楼,望尽天涯路 //日期:12.10 //学习内容:new运算符 //重点: //1、new的基本语法 (在堆区创建数据 通过new 返回该数据的指针) //2、形式: 指针 = new (类型 + 数据) 数据类型: [](数组) ,() (数字,字符) //3、(类型 + 数据) -> 内存空间 new 返回该内存空间的地址 (指针 = 地址) //4、堆区的数据 由程序员管理开辟,程序员管理释放 (释放形式 : delete + 指针) //5、内存被释放

今天的博客 1398

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【c++深入系列】:new和delete运算符详解

学会并掌握new和delete运算符,看这一篇文章就够了!

努力努力再努力wz的博客 1560

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++:new运算符和new表达式详解

摘要:在C++中new是一个行为和语法都有点诡异的结构,它的语法上与其它C++语法不同,它在语义上却也经常引起人们的不解,尤其当用户自定义的new在使用的时候。本文试图回答作者在学习new的时候遇到的问题,同时这些问题也可能是大多数人首先遇到的问题。 目录 [隐藏] new 关键字 new 运算符 new 表达式 new 关键字 new是C++的关键字,它不仅仅

cwchenwu88的专栏 9054

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

全面理解C++ new运算符:从基础到高级

newnewnew。

m0_72877724的博客 2354

C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符

new和delete运算符也可以像C ++中的其他运算符一样重载。New和Delete运算符可以全局重载,也可以在特定类中重载。 (1)如果使用某个类的成员函数来重载这些运算符,则意味着这些运算符仅针对该特定类才被重载。 (2)如果重载是在类外部完成的(即它不是类的成员函数),则只要您使用这些运算符(在类内或类外),都将调用重载的“ new”和“ delete”。这是全局超载。 重载new运算符的语法: void *运算符new(size_t size); 重载的new运算符接收的大小为s

致力于C语言C++知识分享! 753

C++:new运算符的重载

参考:https://zhuanlan.zhihu.com/p/269251267。size_t size:为分配的内存的大小。2.1 类的new和delete重载。void*:指向分配的内存的指针。

小孔明的专栏 1826

【C++】《C++ 17 入门经典》读书笔记 10----指针运算符:new 和 delete

介绍 C++17 中指针运算符:new、delete 使用要点。

风语留痕 380

C++ 定位new运算符: new (void*) xxx

new(void*) xxx的用法

铁头娃 1663

c++的一些基本知识:new 运算符号

/T :任意类型名 P :类型为T*的指针 N:要分配的数组元素的个数。//这两个表达式返回值的类型都是T*//导致异常,一片空间不能被delete多次。用“new”动态分配的内存空间,一定要用“delete”运算符进行释放。字节的内存空间,并且将该内存空间的起始地址赋值给P。//该指针必须指向new出来的数组。//该指针必须指向new出来的空间。P = new T;字节的内存空间,并且将该内存空间的起始地址赋值给P。用“delete”释放动态分配的数组,要加 []

m0_66847953的博客 416

c++:new和delete的运算符重载

在重写new的时候要申请堆空间在重写delete的时候要释放堆空间。

weixin_59669309的博客 602

C++学习笔记11:定位new运算符

使用定位new运算符应注意: 注意内存覆盖delete不能与定位new运算符配合使用,因此要显示地为定位new运算符创建的对象调用析构函数删除顺序:后创建的对象先删除,所有用定位new运算符创建的对象都被删除后再释放用于存储这些对象的缓冲区 #include #include #include using namespace std; const int BUF = 512;

Seawood_Xie的博客 1226

C++动态内存:(一)new/new[]、delete/delete[]运算符

一、为什么需要new? C语言中已经有了动态内存分配的函数malloc(链接:malloc/free的实现及malloc实际分配的内存)以及malloc的变体calloc/realloc(链接:C语言malloc/calloc/realloc)。在内置类型的动态创建上这些函数依然可以很好的工作。但是对于自定义类型和类这些函数将不能很好的运行。因为构造函数不允许我们向它传递内存地址进行初始化(构造函数不能被显示的调用–它是在对象创建时由编译器调用)。如果那么做了,将可能; (1)忘记初始化。则在C++中有保证

李肖遥的专栏 1442

c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符

new和delete运算符也可以像C ++中的其他运算符一样重载。New和Delete运算符可以全局重载,也可以在特定类中重载。(1)如果使用某个类的成员函数来重载这些运算符,则意味着这些运算符仅针对该特定类才被重载。(2)如果重载是在类外部完成的(即它不是类的成员函数),则只要您使用这些运算符(在类内或类外),都将调用重载的“ new”和“ delete”。这是全局超载。重载new运算...

weixin_39881513的博客 136
上一篇: C++:乘法运算符和取模运算符
下一篇: C++:二进制求补运算符:~
「已注销」
博客等级 码龄5年 27粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值