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 对象声明,即使不存在,也不 ...
随机推荐
- ACTF flutter逆向学习
参考了许多大佬的博客,在此特别诚挚感谢oacia大佬和其他大佬的博客和指导! 1.flutter和apk基础结构介绍 首先下载附件,是一个apk文件,用jadx打开 可以看见flutter字样,而fl ...
- 文心一言 VS 讯飞星火 VS chatgpt (174)-- 算法导论13.3 3题
三.用go语言,假设图13-5 和图13-6 中子α.β.γ.δ和ε的黑高都是k.给每张图中的每个结点标上黑高,以验证图中所示的转换能保持性质 5. 文心一言: 在Go语言中,你可以通过以下步骤来为图 ...
- Rasa中的tracker_store和event_broker
Rasa 中的 tracker_store 相对主流为 Redis,event_broker 相对主流为 RabbitMQ.后续为了研究学习直接将 tracker_store 和 event_br ...
- 全域Serverless+AI,华为云加速大模型应用开发
日前,华为全联接大会2023在上海召开.华为云CTO张宇昕在大会上发布了基于Serverless技术的大模型应用开发框架,框架以面向AI领域全新升级的FunctionGraph 3.0为核心,将Baa ...
- 火山引擎DataTester:跨境电商网站,如何快速实施AB测试 ?
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 如今中企出海的形态愈加多样,很多企业都建有独立站可直接触达海外客户,但获取优质流量的成本会更加高昂.当优质流量 ...
- [BitSail] Connector开发详解系列四:Sink、Writer
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 Sink Connector BitSail Sink Connector交互流程介绍 Sink:数据写入组件的生 ...
- Pytest.mark.parametrize()基本用法
Pytest.mark.parametrize()基本用法 @pytest.mark.parametrize()基本用法 数据驱动:就是把我们测试用例的数据放到excel,yaml,csv,mysql ...
- docker安装aira2 pro与ariang以及alist推送下载的配置
Docker一键安装 aira2-pro: docker run -d --name aria2 --restart unless-stopped --log-opt max-size=1m -e P ...
- 谣言粉碎机?Python验证股市操盘口诀
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 经常炒股的朋友,应该都听说过这段操盘口诀: 早上大跌要买,早上大涨要卖 下午大涨不追,下午大跌次日买 早 ...
- Linux 下运行.NET 6 7 8 程序遇到的两个问题
一. /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 的解决办法 1. 下载 libstdc++.so.6.0.21 文件 注意区分 ...