new

new 是C++ 中的关键字,有两个含义

  1. new 表达式
  2. 作为运算符的函数名,也就是 operator new

new 表达式

提供一个特定的内存分配格式,返回在存储空间上构造的对象或对象数组的一个 纯右值 指针。

语法

  • :: (可选) new (布置参数)(可选) (类型) 初始化器(可选)
  • :: (可选) new (布置参数)(可选) 类型 初始化器(可选)

说明

  1. 布置参数为分配的内存
  2. 初始化器则有两种,分别是(){} 初始化方式,可以包括 auto decltype(auto) 等占位类型说明符
char* ptr = new char[sizeof(T)]; // 分配内存
T* tptr = new(ptr) T; // 在已分配存储中构造(“布置”)
tptr->~T(); // 销毁
delete[] ptr; // 解分配内存

一些注意点

  1. 表达式中的 类型为贪心,比如 new int * 1 实际上是 int 先结合 *,(这个会编译失败)。
  2. 在对象数组分配内存时,一维之外的维数必须指定为整数常量。
  3. new 表达式是为对象分配是调用 operator new 来完成,对象的大小可以在编译期得到 (开优化),之后进行对象的构造,构造过程的规则无特殊之处。

operator new

new 表达式通过调用 operator new 来分配内存,分配对象数组为 operator new[].

C++ 自身提供了全局的函数(以::开始),和用户自定义的替换函数,如果 new T; 中T为类类型,则从T的类作用域中开始查找替换函数。

基本的函数格式如下:

void* T::operator new  ( std::size_t count );

这里我们自定义一个例子,operator new 是我们自定义的分配函数,后面部分是对在已经分配的内存上进行再分配的情况

  • 在已有内存上分配空间,不会再调用分配函数,
  • 每次分配的内存地址都相同。

    所以每次调用默认布置分配函数的时候,只是一个内存控制权的转移,这段内存的生命生命周期应该在其上构造对象之后。
#include <iostream>
#include <cstdlib>
#include <cstdio> void *operator new(size_t n) {
printf("operator new: %zu\n", n);
return std::malloc(n);
}
struct Foo {
uint64_t valu64;
int64_t vali64;
char ch; Foo() : valu64(1), vali64(3), ch('c') {}
}; int main() {
char *ptr = new char[16]; // std::malloc(16);
Foo *tptr = new (ptr) Foo; // 在已分配存储中构造(“布置”), 这里有溢出风险
tptr->~Foo(); // 销毁
delete[] ptr; // 解分配内存 Foo *fp = new Foo; // std::malloc(24); char arr[36];
printf("init arr addr: %p\n", arr); // 0x7ffe8f9748e0
Foo *fptr = new (arr) Foo;
printf("Foo addr: %p\n", fptr); // 0x7ffe8f9748e0
char *ch = new (arr) char;
printf("ch addr: %p\n", ch); // 0x7ffe8f9748e0, 三者的地址是一样的
fptr->~Foo(); // 销毁
}

参考

  1. new. C++ 关键字 new.

// 过年疫情导致不能出门,在家里学习学习,记点笔记。

C++ 关键字 new的更多相关文章

  1. 作为一个新手的Oracle(DBA)学习笔记【转】

    一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cm ...

  2. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  3. java面向对象中的关键字

    1,super关键字 super:父类的意思 1. super.属性名 (调用父类的属性) 2. super.方法名 (调用父类的方法) 3. super([参数列表])(调用父类的构造方法) 注意: ...

  4. 关于javascript中的this关键字

    this是非常强大的一个关键字,但是如果你不了解它,可能很难正确的使用它. 下面我解释一下如果在事件处理中使用this. 首先我们讨论一下下面这个函数中的this关联到什么. function doS ...

  5. transient关键字的用法

    本篇博客转自 一直在路上 Java transient关键字使用小记 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java ...

  6. Java关键字:static

    通常,当创建类时,就是在描述那个类的外观和行为.只有用new创建类的对象时,才分配数据存储空间,方法才能被调用.但往往我们会有下面两种需求: 1.我想要这样一个存储空间:不管创建多少对象,无论是不创建 ...

  7. Core Java 总结(关键字,特性问题)

    2016-10-19 说说&和&&的区别 初级问题,但是还是加入了笔记,因为得满分不容易. &和&&都可以用作逻辑与的运算(两边是boolean类型), ...

  8. Net中的常见的关键字

    Net中的关键字有很多,我们最常见的就有new.base.this.using.class.struct.abstract.interface.is.as等等.有很多的,在这里就介绍大家常见的,并且有 ...

  9. php多关键字查询

      php单一关键字查询 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 tdansitional//EN" "http: ...

  10. Keil> 编译器特有的功能 > 关键字和运算符 > __weak

    __weak 此关键字指示编译器弱导出符号. 可以将 __weak 关键字应用于函数和变量声明以及函数定义. 用法 函数和变量声明 对于声明,此存储类指定一个 extern 对象声明,即使不存在,也不 ...

随机推荐

  1. websocket实现实时直播

    websocket实现实时直播 这篇文章我首发于简书,拿到这里发表不过分吧?点个赞再走呗! 作为一名web开发者,我使用websocket实现实时直播(滑鸡版). 为什么是滑鸡版呢?因为他上不了生产, ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (158)-- 算法导论12.3 5题

    五.用go语言,假设为每个结点换一种设计,属性 x.p 指向 x 的双亲,属性 x.succ 指向 x 的后继.试给出使用这种表示法的二叉搜索树 T 上 SEARCH.INSERT 和DELETE 操 ...

  3. Jenkins汉化配置

    登录进入Jenkins首页 输入:本地ip+端口号(localhost:8099) 进入插件管理页面(Manage Jenkins)安装相关插件 搜索:到available栏目搜索:Locale pl ...

  4. vue图片由小放大

    原生效果 <template> <div> <transition> <img :src="imageUrl" class="i ...

  5. MindSpore!这款刚刚开源的深度学习框架我爱了!

    [摘要] 本文主要通过两个实际应用案例:一是基于本地 Jupyter Notebook 的 MNIST 手写数据识别:二是基于华为云服务器的 CIFAR-10 图像分类,对开源框架 MindSpore ...

  6. 7000+字图文并茂解带你深入理解java锁升级的每个细节

    摘要:对于java锁升级,很多人都停留在比较浅层的表面理解,这篇7000+字和图解带你深入理解锁升级的每个细节. 本文分享自华为云社区<对java锁升级,你是否还停留在表面的理解?7000+字和 ...

  7. 解放重复劳动丨华为云IoT API Explorer对接小程序实现系统化应用

    摘要:<物联网平台接口调用实验>详细讲解了API Explorer的应用,根据提供的接口,结合真实案例,制作了一个小程序,真正的把它应用起来,解放重复劳动,小程序是一个很好的平台,作为应用 ...

  8. 华为AppCube入选Forrester《中国低代码平台市场分析报告》

    摘要:知名研究与分析机构Forrester于11月11日发布<中国低代码平台市场分析报告(The State Of Low-Code Platforms In China)>,AppCub ...

  9. 登录appuploader

    ​ 转载:登录appuploader 常规使用登录方法 双击appuploader.exe 启动appuploader 点击底部的未登录,弹出登录框 在登录框内输入apple开发者账号 如果没有app ...

  10. 差点错过!火山引擎VeDI帮这家企业成功挖掘200余条商机

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 与个体消费市场临时性需求大.决策参与人少等情况不同,企业消费市场往往因为长线需求复杂.商品/服务的价格高.参与决策 ...