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/C++内存分布及管理方式 | new/delete实现原理及operator new和operator delete函数

C++初阶:内存管理C/C++内存分布及管理方式 | new/delete实现原理及operator new和operator delete函数