C++中new一个对象
对象很难找吗?new
几个不就好了吗?
C++语言中,当我们new一个对象时候,背后做了哪些事情呢?
new operator 和operator new
1 | string *str = new string("welcome here"); |
上面这句代码我们使用了new操作符,创建了一个string
类型对象,这个new操作符就是new operator
,它做这两件事情:
- 分配一块内存
- 调用一个构造函数,设定对象初值。
new operator
一定会做这两件事情,而operator new
就是其中一项——分配内存。
函数operator new
通常声明如下,它接收一个内存size,返回分配的内存地址,这是一块原始的,没有被初始化的内存。
1 | void* operator new(size_t size) |
operator new
唯一做的事情就是分配内存。
1 | class NewDemo { |
输出:
size: 4
1 | class NewDemo { |
结果:
开始分配内存
p addr: 0000024F6C563310
开始构造
demo addr: 0000024F6C563310
可以看到最终对象对应的指针demo
和operator new
中的分配出来的那块内存是对应同一块内存。
placement new
经过上面内容的讲解,我们知道在通过new关键字创建一个对象时候,会先分配内存,再针对这块内存做对象初始化。
可以考虑下,如果我们已经有了一内存,需要在这个上面构建对象,可不可以做到这一点。
实际上,placement new
就允许这么干.placement new
是一种特殊的operator new
,它声明的方式是下面这样的,需要传入一个void*
入参,指向一块内存。
1 | void* operator new(size_t, void *location) |
结语
这篇文章,希望读者使用new关键字构建一个对象时候,要清楚这背后发生了什么事情,并不是要学会placement new这种几乎不会用到操作。
另外与new相反的操作delete,同样对应一个operator delete
来释放内存。