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

问题描述 投票:2回答:4

我知道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关键字不同?

c++ new-operator operator-keyword delete-operator
4个回答
3
投票

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

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


8
投票

new关键字(单独使用)与delete功能不同。

通话中

new

相当于通话中

delete

新的运算符(或更佳的new变量)仅分配内存,但不执行任何对象构造。

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

为了从构造中分离分配,将new运算符的变体声明为

Object* p = new Object(value);

并且以前的代码通常写为

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

void* operator new(size_t)本身不执行任何操作,但是被关键字调用将导致构造函数被调用。

相反,销毁和重新分配可以用]分开>

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


3
投票

operator new(size_t, void*)仅表示全局名称空间


3
投票

它们是分配器和解除分配器函数。 p->~Object(); operator delete(p); //no destructor called 运算符可以两件事:它调用分配器函数来获取内存,并且它调用对象的构造函数。 delete p运算符也可以两件事:它调用析构函数,然后调用一个析构函数功能。默认分配器功能为operator delete(void*),并且默认的解除分配器功能为::。两者都可以由用户替换。

© www.soinside.com 2019 - 2024. All rights reserved.