我知道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
个关键字有什么不同?
答案 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)
::
告诉编译器调用全局命名空间中定义的运算符
它是全球new
和delete
运营商的完全限定名称。
请注意,可以replace the global new
and delete
operators as well as overload class-specific new
and delete
operators。因此,程序中可以有两个版本的new
和delete
运算符。带有作用域解析运算符的完全限定名称告诉编译器您指的是运算符的全局版本而不是特定于类的运算符。
答案 2 :(得分:3)
::
仅表示全局命名空间
答案 3 :(得分:3)
它们是分配器和解除分配器功能。 new
运算符可以
两件事:它调用一个分配器函数来获取内存,以及它
调用对象的构造函数。 delete
运算符也可以
两件事:它调用析构函数,然后调用一个deallocator
功能。默认的分配器功能是::operator new
,并且
默认的deallocator函数是::operator delete
。两者都可以
由用户替换。
请注意,在新表达式中,会查看::operator new
函数
以与正常情况相同的方式或多或少地相同
从成员函数中调用的函数。至于正常功能,
您可以限定操作员更改查找:new MyClass
将
找一个成员operator new
,如果有的话; ::new MyClass
将使用
默认分配器,即使MyClass
定义了成员operator
new
。