C++的new

2023-05-16

C++中的new其实是一个很糊弄人的术语,它有两种不同的含义,new运算符(new operator)和new函数(operator new),值得记录一下。

一 new运算符

最常用的是作为运算符的new,比如:

string *str = new string(test new);

作为运算符,new和sizeof一样,是C++内置的,你不能对它做任何的改变,除了使用它。

new会在堆上分配一块内存,并会自动调用类的构造函数。

二 new函数

第二种就是new函数,其实new运算符内部分配内存使用的就是new函数,原型是:

void *operator new(size_t size);

new函数返回的是一个void指针,一块未经初始化的内存。如你所见,这和C语言的malloc行为相似,你可以重载new函数,并且增加额外的参数,但是必须保证第一个参数必须是size_t类型,它指明了分配内存块的大小,C++允许你这么做,当然一般情况下这是不必要的。如果重载了new函数,在使用new操作符时调用的就是你重载后的new函数了。

如果使用new函数,和语句string *str = new string(“test new”)相对的代码大概是如下的样子:

string *str = (string*)operator new(sizeof(string));

str.string(“test new”); // 当然这个调用时非法的,但是编译器是没有这个限制的

这还不算完,还有第三种的new存在。

三 placement new

第三种,placement new,这也是new作为函数的一种用法,它允许你在一块已存在的内存上分配一个对象,而内存上的数据不会被覆盖或者被你主动改写,placement new同样由new操作符调用,调用格式是:

new (buffer) type(size_t size);

先看看下面的代码:

char str[22];

int data = 123;

int *pa = new (&data) int;

int *pb = new (str) int(9);

结果*pa = 123(未覆盖原数据),而*pb = 9(覆盖原数据),可以看到placement new 并没有分配新的内存,也可以使用在栈上分配的内存,而不限于堆。

为了使用placement new 你必须包含<new>或者<new.h>

其实placement new和第二种一样,只不过多了参数,是函数new的重载,语法格式为:

void *operator new(size_t, void* buffer);

它看起来可能是这个样子:

void *operator new(size_t, void* buffer) { return buffer;}

 

和new对应的就是delete了,需要回收内存啊,不然就泄漏了,这个下次再写吧,回忆一下今天的内容先。

总结

1. 函数new

void *operator new(size_t size); 在堆上分配一块内存,和placement new(void *operator new(size_t, void* buffer)); 在一块已经存在的内存上创建对象,如果你已经有一块内存,placement new会非常有用,事实上,它STL中有着广泛的使用。

2. 运算符new

最常用的new,没什么可说的。

3. 函数new不会自动调用类的构造函数,因为它对分配的内存类型一无所知;而运算符new会自动调用类的构造函数。

4. 函数new允许重载,而运算符new不能被重载。

5. 紧接着就是对应的delete。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++的new 的相关文章

  • IEEE论文检测的字体未嵌入问题Times New Roman,Bold, Times New Roman,Italic is not embedded解决方法

    1 README 毕业前写了一篇 英文paper xff0c 接受后 xff0c 需要提交到 IEEE PDF Express 做格式检测 xff1b xff1b latex源码中引用了 Visio生成的算法流程图 xff0c PDF文件
  • new释放内存理解c++

    释放内存后 xff0c 本身抄指针的内容是不会改变的即指针指向没有变 xff0c 但是它里面保存的地址所对应的内存在系统里标记为未使用的即指向的内存区域已经被系统收回了 xff0c 这块内存随时可能会被分配给其他进程或进程里面的变量使用 x
  • c++ 中的重载全局new,delete

    最近做一个小项目 xff0c 对c 43 43 又有很多新的理解 实在不的不让人发出感叹 xff0c c 43 43 太强大了 xff0c 绝对不是一朝一夕就可以领悟她的内涵的 首先我们要清楚 xff0c 为什么我们要重载new xff0c
  • 重构 - 消除重复的new创建

    如下 xff1a 有时会遇到这种重复的new创建 span class token keyword public span span class token keyword class span span class token class
  • 用new调用函数的四步走

    JS规定 xff0c 使用new调用函数会进行四步走 xff1a 1 函数体内会自动创建出一个空白对象 2 函数的上下文 xff08 this xff09 会自动指向这个对象 3 函数体内的语句会执行 4 函数会自动返回上下文对象 xff0
  • new Date() 方法到底是获取什么时间

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 问题 java 中 xff0c new Date 方法 获取的时间 xff0c 究竟与当前的系统时间有什么关联 xff1f 简单的时刻对应关系吗 xff1f 2 测试环
  • C++ 构造函数和New运算符

    算法和数据结构就是编程的一个重要部分 xff0c 你若失掉了算法和数据结构 xff0c 你就把一切都失掉了 系统会自动在栈中为每个变量开辟内存空间 xff0c 以保证数值被合理地存放 由于栈是系统自动分配的 xff0c 因此速度较快 xff
  • C++使用new 和new[]操作符分配内存时的调用栈跟踪显示2

    我们可以通过这个技术分析内存泄漏的调用函数和位置 include lt Windows h gt include lt ImageHlp h gt include lt iostream gt include lt string gt in
  • C++构造函数中使用new

    注意事项 如果在构造函数中使用new来初始化指针成员 xff0c 则应在析构函数中使用delete new和delete必须相互兼容 new对应delete xff0c new 对应于delete 如果有多个构造函数 xff0c 则必须以相
  • c++---构造函数以及new和delete的使用

    目录 一 构造函数和析构函数的语法 二 构造函数的分类和调用 三 拷贝构造函数的调用时机 1 用已经创建好的对象来初始化新的对象 2 用值传递的方式 给函数参数传值 3 以值的方式 返回局部对象 四 构造函数调用规则 五 初始化列表 六 类
  • A new value is to be assigned to the field 'L_BOX'

    转载 xff1a https www cnblogs com aurora cj p 9353144 html DUMP A new value is to be assigned to the field 34 lt L BOX gt 3
  • C++中malloc与new方法动态创建数组并释放

    include lt iostream gt using namespace std int main 动态创建释放一维数组 xff08 new xff09 int a 基地址 int n 61 10 数组大小 a 61 new int n
  • xampp 访问出现New XAMPP security concept

    New XAMPP security concept Access to the requested directory is only available from the local network This setting can b
  • 一次向svn中增加所有新增文件 svn add all new files

    http wp4d sinaapp com 2012 02 19 E4 B8 80 E6 AC A1 E5 90 91svn E4 B8 AD E5 A2 9E E5 8A A0 E6 89 80 E6 9C 89 E6 96 B0 E5
  • New Timeline的Toolbar样式设计

    最近在做新版的Timeline xff0c Toolbar Menu 的功能基本完成 xff0c 因此把截图拿出来与各位博友分享一下 新版Timeline HTML版本 主页面 xff1a 这次主要讲解一下Toolbar Menu 的功能
  • c#中new一个对象以后,是否需要手动释放?

    c 中new一个对象以后 xff0c 是否需要手动释放 xff1f 2012 04 28 23 43 wshbfzdzb 分类 xff1a C NET 浏览723次 c 43 43 中 class1 a 61 new class1 需要在用
  • C++ malloc/free/new/delete详解(内存管理)

    这里写目录标题 malloc free 典型用法 内存分配 实现过程 brk和mmap 申请小于128k的内存 申请大于128k的内存 释放内存 brk和mmap的区别 new delete 典型用法 内存分配 实现过程 new delet
  • c++之A a和A *a=new A()

    new是在堆上分配内存 它需要用delete释放 否则会造成内存泄漏 A a 在程序执行完毕后 会自动释放内存 int main A a 定义了一个对象 A p new A 在堆上定义了一个对象 它的指针保存在p里 堆上定义的对象没有名字
  • 柯理化、mergeOptions、new的实现原理、reduce、flat

    1 什么是反柯理化 怎么实现 反柯里化 是一个泛型化的过程 它使得被反柯里化的函数 可以接收更多参数 Function prototype unCurrying function var that this return function
  • Haxe: class, object, new and constructor

    haxe 类 对象 new 和 构造函数 package if neko import neko Lib import neko io File end class Thing public function new trace new f

随机推荐

  • c#的接口详解

    什么是接口 xff1f 其实 xff0c 接口简单理解就是一种约定 xff0c 使得实现接口的类或结构在形式上保持一致 个人觉得 xff0c 使用接口可以使程序更加清晰和条理化 xff0c 这就是接口的好处 xff0c 但并不是所有的编程语
  • C语言中的全局变量定义与使用

    1 书中对 全局变量 的定义 在函数内定义的变量是局部变量 xff0c 而在函数外定义的变量叫做外部变量 xff0c 外部变量是全局变量 全局变量可以为本文件中其他函数所共用它的有效范围从定义变量的位置开始到本源文件结束 建立全局变量的作用
  • C,C++,C#note

    1 c 43 43 中的类的定义和声明可以都写在头文件中 xff0c 然后cpp文件include头文件 xff1b 也可以声明在头文件 xff0c 定义在cpp文件 xff1b 或者所有声明和定义都放在cpp文件 xff1b 混写定义与声
  • 在C++中可以用3种方法访问一个字符串

    用字符数组存放一个字符串 例6 10 定义一个字符数组并初始化 xff0c 然后输出其中的字符串 ol class snippet num style margin top 0px margin bottom 0px margin left
  • 动态存储和静态存储区域区别

    动态存储方式 所谓动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式 动态存储变量是在程序执行过程中 xff0c 使用它时才分配存储单元 xff0c 使用完毕立即释放 典型的例子是函数的形式参数 xff0c 在函数定义时并不
  • c++中默认32位int类型转换截取高位部分

    int类型的变量固定为4个字节 xff0c 共32位 int类型变量初始值一般为0 xff0c 范围 2 31 2 31 1 即 2147483648 xff0c 2147483647 16 位系统下 xff0c int 是 2 个字节 x
  • c#-接口

    c 中的接口中必须是未实现的方法 xff0c 例如属性 xff0c 事件 xff0c 索引器 xff0c 一般函数等 除此之外不能有其他的成员 xff0c 类可以继承两个或两个以上的接口 xff0c 派生类中必须实现接口中的所有方法
  • C# SerialPort 读写三菱FX系列PLC

    1 xff1a 串口初始化 com 61 new SerialPort 34 COM3 34 9600 Parity Even 7 StopBits One 2 xff1a 打开关闭串口 if com IsOpen com Close co
  • c++中用new和不用new创建对象的本质区别

    1 xff1a 作用域不同 不用new xff1a 作用域限制在定义类对象的方法中 xff0c 当方法结束时 xff0c 类对象也被系统释放了 xff0c xff08 安全不会造成内存系统泄漏 xff09 用new xff1a 创建的是指向
  • ubuntu系统通过ifconfig查看eth0只有ipv6没有ipv4的解决方案

    只有inet6 addr 配置eth0 3 重新启动sudo etc init d networking restart IP地址出来了 看起来就正常 4 看其他资料 xff0c linux 43 QT4 0 xff0c 在这个开发板上的l
  • Action<T> 无参数委托详解

    C 委托Action Action lt T gt Func lt T gt Predicate lt T gt CLR环境中给我们内置了几个常用委托Action Action lt T gt Func lt T gt Predicate
  • 在C++里,有两种方法创建对象:

    方法一 xff1a ClassName object param 这样就声明了一个ClassName类型的object对象 xff0c C 43 43 会为它分配足够的存放对象所有成员的存储空间 注意 xff1a 为节省存储空间 xff0c
  • C++中引用(&)的用法和应用实例

    对于习惯使用C进行开发的朋友们 xff0c 在看到c 43 43 中出现的 amp 符号 xff0c 可能会犯迷糊 xff0c 因为在C语言中这个符号表示了取地址符 xff0c 但是在C 43 43 中它却有着不同的用途 xff0c 掌握C
  • C++中重载与重写函数区别及虚函数(转载)

    C 43 43 中重载与重写函数区别及虚函数 C 43 43 中的虚函数 virtual function 1 简介 虚函数是C 43 43 中用于实现多态 polymorphism 的机制 核心理念就是通过基类访问派生类定义的函数 假设我
  • c#中的静态构造函数

    静态构造函数是C 的一个新特性 xff0c 其实好像很少用到 不过当我们想初始化一些静态变量的时候就需要用到它了 这个构造函数是属于类的 xff0c 而不是属于哪里实例的 xff0c 就是说这个构造函数只会被执行一次 也就是在创建第一个实例
  • C++中重写与覆写(虚函数virtual)的区别

    本文章已收录于 xff1a 虚函数的情况下调用成员函数时调用的是指向对象的所属类的成员函数例子中为apple class fruit public void func printf 34 fruit n 34 virtual void vf
  • duilib入门问题集

    引入duilib时 请确保引入头文件开始时先引入COMUTIL H头文件 include 34 COMUTIL H 34 include 34 UIlib h 34 duilib基本程序结构 在stdafx h文件中加入 cpp view
  • C#中常用的几种读取XML文件的方法

    XML文件是一种常用的文件格式 xff0c 例如WinForm里面的app config以及Web程序中的web config文件 xff0c 还有许多重要的场所都有它的身影 Xml是Internet环境中跨平台的 xff0c 依赖于内容的
  • C++(1) 指针 new 和delete

    1 概念 new typeName pointer name 61 new typeName delete delete pointer name 注意 xff1a 1 new之后要判断 xff0c 指针是否为NULL xff0c 内存被耗
  • C++的new

    C 43 43 中的new其实是一个很糊弄人的术语 xff0c 它有两种不同的含义 xff0c new运算符 xff08 new operator xff09 和new函数 xff08 operator new xff09 xff0c 值得