什么是“:: operator new”和“:: operator delete”?

时间:2012-05-09 09:35:04

标签: c++ new-operator operator-keyword delete-operator

我知道newdelete是关键字。

int obj = new int;
delete obj;

int* arr = new int[1024];
delete[] arr;

<new>标头是C ++标准标头的一部分。它有两个运算符(我不确定它们是运算符还是函数):

::operator new

::operator delete

这些运算符如下所示:

#include <new>
using namespace std;

int* buff = (int*)::operator new(1024 * sizeof(int));
::operator delete(buff);

什么是“:: operator new”和“:: operator delete”?它们与newdelete个关键字有什么不同?

4 个答案:

答案 0 :(得分:6)

new关键字(单独使用)与operator new函数不同。

调用

Object* p = new Object(value);

在调用中是等价的

void* v = operaor new(sizeof(Object));
p = reinterpret_cast<Object*>(v);
p->Object::Object(value); //this is not legal C++, it just represent the implementation effect

operator new(或更好的void* operator new(size_t)变体)只是分配内存,但不进行任何对象构建。

new关键字调用operator new函数,但随后调用对象构造函数。

为了将分配与contruction分开,operator new的变体被声明为

void* operator new(size_t, void* at)
{ return at; }

以前的代码通常写为

Object* p = reinterpret_cast<Object*>(operator new(sizeof(Object))); //no contruction here
new(p) Object(value); //calls operator new(size_t, void*) via keyword

operator new(size_t, void*)本身没有任何作用,但是,由关键字调用将导致调用构造函数。

相反,销毁和解除分配可以用

分隔
p->~Object();
operator delete(p); //no destructor called

而不是delete p;调用析构函数然后调用operator delete(void*)

答案 1 :(得分:3)

::告诉编译器调用全局命名空间中定义的运算符 它是全球newdelete运营商的完全限定名称。

请注意,可以replace the global new and delete operators as well as overload class-specific new and delete operators。因此,程序中可以有两个版本的newdelete运算符。带有作用域解析运算符的完全限定名称告诉编译器您指的是运算符的全局版本而不是特定于类的运算符。

答案 2 :(得分:3)

::仅表示全局命名空间

答案 3 :(得分:3)

它们是分配器和解除分配器功能。 new运算符可以 两件事:它调用一个分配器函数来获取内存,以及它 调用对象的构造函数。 delete运算符也可以 两件事:它调用析构函数,然后调用一个deallocator 功能。默认的分配器功能是::operator new,并且 默认的deallocator函数是::operator delete。两者都可以 由用户替换。

请注意,在新表达式中,会查看::operator new函数 以与正常情况相同的方式或多或少地相同 从成员函数中调用的函数。至于正常功能, 您可以限定操作员更改查找:new MyClass将 找一个成员operator new,如果有的话; ::new MyClass将使用 默认分配器,即使MyClass定义了成员operator new