operator new & operator delete
Posted vector6_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了operator new & operator delete相关的知识,希望对你有一定的参考价值。
operator new & operator delete
new operator 和 operator new
对于如下代码:
string *ps = new string("string construct");
代码中使用的new 即为 new operator,这个操作符是由语言内建的,类似sizeof ,不能被改变意义(重载)。不能改变其行为。
我们知道 new operator 主要做了两件事:
- 分配足够的内存,用来放置某类型的对象。
- 调用一个constructor,为刚才分配的内存中的对象设定初值。
而第一步中的调用的函数,就是 operator new,通常声明为:
void* operator new (size_t size);
该函数返回一个指针,指向一块原始的、未设初值的内存。operator new 的唯一任务是分配内存。我们可以重载该函数,加上额外的参数,但是第一参数的类型必须是size_t。而且也可以向调用其他函数一样调用它:
void* rawMemory = operator new(sizeof(string));
所以这里两者的区分就很明显了:
- operator new: 分配内存
- new operator: 取得返回的内存,并调用对应的构造函数将之转换为一个对象。
另外,还有一种placement new,一般用法为:
void* operator new(size_t, void* location)
return location;
其实 placement new 就是一种特殊的 operator new,不同之处在于参数中接收了一个额外的参数 void*,指向一块内存,准备用来接受构造好的对象。其实 placement new 所要做的就是将它获得的指针(指向所需的内存)再返回。
delete operator 和 operator delete
我们知道为了避免内存泄漏,每一个动态分配行为都必须匹配一个相应的释放动作。与new operator 和 operator new 相对应的即是内建操作符delete operator 和 函数operator delete。
类似的,delete operator 作为语言内建的操作符,不能被改变意义(重载),它主要的行为是:
- 调用对象的destructor
- 释放该对象所占用的内存
而operator delete 主要的行为即是释放相应的内存。
需要注意的是,使用 delete operator 或operator delete 需要与上面的new operator 和 operator new 相对应。
以上是关于operator new & operator delete的主要内容,如果未能解决你的问题,请参考以下文章
operator new & operator delete
std::unordered_map::operator[] - 为啥有两个签名?
什么是“::operator new”和“::operator delete”?
C++初阶:内存管理C/C++内存分布及管理方式 | new/delete实现原理及operator new和operator delete函数
C++初阶:内存管理C/C++内存分布及管理方式 | new/delete实现原理及operator new和operator delete函数