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
的异常
文章评论