什么是"::operator new"和"::operator delete"?
What are "::operator new" and "::operator delete"?
我知道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);
什么是"::运算符新"和"::运算符删除"?它们与new
和delete
关键字不同吗?
new
关键字(单独使用)与operator 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
运算符 new(或更好的是 void* operator new(size_t)
变体)只分配内存,但不执行任何对象构造。
new
关键字调用运算符 new 函数,但随后调用对象构造函数。
为了将分配与构造分开,运算符 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*)
。
::
告诉编译器调用全局命名空间中定义的运算符。
它是全局new
和delete
运算符的完全限定名称。
请注意,可以替换全局new
和delete
运算符,以及重载特定于类的new
和delete
运算符。因此,程序中可以有两个版本的new
运算符和delete
运算符。带有作用域解析运算符的完全限定名告诉编译器您引用的是运算符的全局版本,而不是特定于类的运算符。
它们是分配器和解除分配器函数。 new
运算符执行的操作两件事:它调用分配器函数来获取内存,以及它调用对象的构造函数。 delete
运算符也这样做两件事:它调用析构函数,然后调用 A Deallocator功能。 默认分配器函数为 ::operator new
,并且默认的解除分配器功能是 ::operator delete
。 两者都可以是由用户替换。
请注意,在新表达式中,查找 ::operator new
函数或多或少以与正常方式相同的方式向上从成员函数中调用的函数。 至于正常功能,您可以限定操作员更改查找:new MyClass
将查找成员operator new
如果有; ::new MyClass
将使用默认分配器,即使MyClass
定义了成员operator
new
。
::
表示只是一个全局命名空间
- 运算符C++ "delete []"仅删除 2 个前值
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 'operator='已弃用:改用 QDir::setPath()
- 过载'operator new'如何导致无限循环?
- g++用户定义的动态链接库上的全局new和delete运算符
- 为什么"delete"关键字不删除节点?
- 与'operator='不匹配(操作数类型'String'且"void")
- "delete"在 C++ 中实际上做了什么?
- C++和组装:通过ASM呼叫'operator new'和'operator delete'
- 什么是"::operator new"和"::operator delete"?
- 我可以对单个元素数组分配使用“operator delete[]”吗
- 正在对使用operator new okay的放置delete操作的结果调用delete
- g++ 4.9.0允许对位置分配使用operator delete[](void*, size_t)
- 为什么"const T*"在"operator delete"中被简单地转换为"void*"?
- c++ 14是否要求delete表达式必须调用' void operator::delete(void*, std::
- 为什么 gcc 4.9.0 中没有定义"void operator delete(void* ptr, std::size_t size) noexcept;"?
- 线程清理器报告使用嵌入式参考计数器时"data race on operator delete(void*)"
- visual C++ Delete Operator
- :operator delete(void*)是否知道使用::operator new(size_t)分配的内存大小
- 替换函数'operator new'不能声明'inline' [-werror,-winline-new-delete]