我知道new
和delete
是关键字。
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”?它们是否与new
和delete
关键字不同?
::
告诉编译器调用全局命名空间中定义的运算符。它是全局new
和delete
运算符的完全限定名称。
注意,可以replace the global new
and delete
operators as well as overload class-specific new
and delete
operators。因此,程序中可以有new
和delete
运算符的两个版本。具有范围解析运算符的全限定名称告诉编译器您所引用的是全局版本的运算符,而不是特定于类的运算符。
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
。
operator new(size_t, void*)
仅表示全局名称空间
它们是分配器和解除分配器函数。 p->~Object();
operator delete(p); //no destructor called
运算符可以两件事:它调用分配器函数来获取内存,并且它调用对象的构造函数。 delete p
运算符也可以两件事:它调用析构函数,然后调用一个析构函数功能。默认分配器功能为operator delete(void*)
,并且默认的解除分配器功能为::
。两者都可以由用户替换。