C++ 关键字 new
new
new 是C++ 中的关键字,有两个含义
- new 表达式
- 作为运算符的函数名,也就是
operator new
new 表达式
提供一个特定的内存分配格式,返回在存储空间上构造的对象或对象数组的一个 纯右值 指针。
语法
- :: (可选) new (布置参数)(可选) (类型) 初始化器(可选)
- :: (可选) new (布置参数)(可选) 类型 初始化器(可选)
说明
- 布置参数为分配的内存
- 初始化器则有两种,分别是
()和{}初始化方式,可以包括auto decltype(auto)等占位类型说明符
char* ptr = new char[sizeof(T)]; // 分配内存
T* tptr = new(ptr) T; // 在已分配存储中构造(“布置”)
tptr->~T(); // 销毁
delete[] ptr; // 解分配内存
一些注意点
- 表达式中的 类型为贪心,比如
new int * 1实际上是int先结合*,(这个会编译失败)。 - 在对象数组分配内存时,一维之外的维数必须指定为整数常量。
- 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(); // 销毁
}
参考
- new. C++ 关键字 new.
// 过年疫情导致不能出门,在家里学习学习,记点笔记。
C++ 关键字 new的更多相关文章
- 作为一个新手的Oracle(DBA)学习笔记【转】
一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cm ...
- JavaScript var关键字、变量的状态、异常处理、命名规范等介绍
本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...
- java面向对象中的关键字
1,super关键字 super:父类的意思 1. super.属性名 (调用父类的属性) 2. super.方法名 (调用父类的方法) 3. super([参数列表])(调用父类的构造方法) 注意: ...
- 关于javascript中的this关键字
this是非常强大的一个关键字,但是如果你不了解它,可能很难正确的使用它. 下面我解释一下如果在事件处理中使用this. 首先我们讨论一下下面这个函数中的this关联到什么. function doS ...
- transient关键字的用法
本篇博客转自 一直在路上 Java transient关键字使用小记 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java ...
- Java关键字:static
通常,当创建类时,就是在描述那个类的外观和行为.只有用new创建类的对象时,才分配数据存储空间,方法才能被调用.但往往我们会有下面两种需求: 1.我想要这样一个存储空间:不管创建多少对象,无论是不创建 ...
- Core Java 总结(关键字,特性问题)
2016-10-19 说说&和&&的区别 初级问题,但是还是加入了笔记,因为得满分不容易. &和&&都可以用作逻辑与的运算(两边是boolean类型), ...
- Net中的常见的关键字
Net中的关键字有很多,我们最常见的就有new.base.this.using.class.struct.abstract.interface.is.as等等.有很多的,在这里就介绍大家常见的,并且有 ...
- php多关键字查询
php单一关键字查询 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 tdansitional//EN" "http: ...
- Keil> 编译器特有的功能 > 关键字和运算符 > __weak
__weak 此关键字指示编译器弱导出符号. 可以将 __weak 关键字应用于函数和变量声明以及函数定义. 用法 函数和变量声明 对于声明,此存储类指定一个 extern 对象声明,即使不存在,也不 ...
随机推荐
- 使用gradle的方式进行Springboot3的web开发(微服务版)
简要: 最近看了很多的Springboot3的项目,但是发现很多都是用maven来进行版本管理的,很少有用gradle来管理的,通过网上查找资料,看视频,终于自己写一个gradle管理的Springb ...
- 技本功|统计信息对SQL执行效率的影响
在一个风和日丽的下午,奋哥哥突然接到业务方线上业务数据库CPU资源告警信息,立马放下手里的枸杞登录业务方阿里云控制台查看具体问题. 对于数据库当前正在发生中的问题,我们首先从数据库实时会话信息中尝试抓 ...
- python异步编程之asyncio低阶API
低阶API介绍 asyncio中低阶API的种类很多,涉及到开发的5个方面.包括: 获取事件循环 事件循环方法集 传输 协议 事件循环策略 本篇中只讲解asyncio常见常用的函数,很多底层函数如网络 ...
- 热闹的人工智能VS酷寒的资本寒冬,2023年AI Agent项目盘点与融资分析
2023年国内AI Agent下项目大盘点,科技大厂与创业公司齐头并进 热闹人工智能VS酷寒资本寒冬,2023年AI Agent项目盘点与融资分析 资本寒冬下的AIGC,为什么这些AI Agent项目 ...
- 袋鼠云数栈UI5.0设计实战|B端表单这样设计,不仅美观还提效
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:大喜 相关文章:袋鼠云出品!数栈UI 5.0全新体验升级, ...
- 最大伪森林——kruskal算法活用 (HDU - 3367)
最大伪森林--kruskal算法活用 (HDU - 3367) kruskal这一用来求生成树的算法,经过修改拓展之后,可以求很多种形式的子图,本题(HDU3367)即为一个应用案例 单击进入原题 以 ...
- Linux系统快速入门
LINUX基础知识 I.Linux概述 linux是啥? 一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的Un ...
- JVM学习-类加载机制
文章原文:https://gaoyubo.cn/blogs/4b481fd7.html 一.类加载机制 在JVM学习-Class文件结构中,讲了Class文件存储格式的具体细节.虽然Class文件中描 ...
- 【华为云技术分享】STM32L476移植华为LiteOS系列教程------背景知识 1
一.这篇文章想向大家说明一个问题,我们开发单片机的本质是什么? 在最早的开发中,我们没有Keil.IAR等等一系列好用的单片机集成开发环境,注意这里的"集成",是指将多个软件其中有 ...
- vue2升级vue3:class component的遗憾
在vue2,class 写法真的非常爽 import { Component as tsc } from 'vue-tsx-support'; import { Component, Watch } ...