More than code

More Than Code
The efficiency of your iteration of reading, practicing and thinking decides your understanding of the world.
  1. 首页
  2. daily
  3. 正文

Daily C/C++ new表达式

2021年5月14日 582点热度 0人点赞 0条评论

Daily C/C++ new表达式

今天重新打开了STL源码剖析这本书,想着从头开始看一遍

没想到刚开始的allocator的部分的代码就给我卡住了,最后还是上了cppreference,才找到了比较全的资料,这里就简单说一下c++中的new表达式

首先,new表达式不仅仅是我们平时用来在堆上分配内存用的东西,他还有很多延伸出来的部分

我们来看cppreference的定义

new 表达式尝试申请存储空间,并在已申请的存储空间上,尝试构造并初始化一个无名的对象或对象数组。new 表达式返回一个指向其所构造的对象或者对象数组的纯右值指针。

这个就是我们经常用的new了,他主要有两个部分,他首先会申请内存,然后再从申请的空间上构造对象

new表达式是不可以重载的

对于分配的部分,C++使用的是operator new(这里不考虑数组类型)

operator new会分配内存,十分类似与C语言中的malloc

我们可以重载operator new来优化我们程序中的内存分配

重载的第一个参数必须是size_t,即分配空间的大小

C++为我们提供了全局的实现版本,看cppreference

如分配函数中所描述,C++ 程序可提供这些函数的全局和类特有替换函数。若 new 表达式以可选的 :: 运算符开始,如 ::new T 或 ::new T[n],则忽略类特有替换函数(在全局作用域中查找函数)。否则,若 T 是类类型,则从 T 的类作用域中开始查找。

即如果我们在开头处使用了::,那么C++就会在查找全局的operator new

C++还为我们定义了若干个operator new的重载版本,具体可以在这里查看用法

有一点要说的是,有一种重载版本叫做不分配布置分配函数,中文翻译起来有点怪

这个是函数原型,void* operator new ( std::size_t count, void* ptr );

他的作用不是让我们分配一定的空间,而是帮我们进行placement

比如我们有一块已经分配好的空间,但是这个空间还没有被使用,那么我们就可以使用这个placement new来在这个空间上进行构造

说白了,布置的作用就是让我们在ptr指向的内存区域上进行对象的构造,同时他会忽略count参数,并返回未更改的ptr指针

所以有没有感觉new就像是operator new和placement new的结合,一个分配,一个构造

最后还有一个比较有意思的一点是,定义在<new>中的有一个函数叫set_new_handler

他可以帮我们注册一个new的处理函数,当new分配内存失败的时候我们就可以调用这个处理函数,如果我们将其设置为0的话,以及他的默认行为,就是会抛出一个std::bad_alloc的异常

标签: c++
最后更新:2021年5月14日

sheep

think again

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 heavensheep.xyz. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS