' operator new '是否是c++核心语言的一部分?
Is `operator new` a part of C++ core language?
我多次被告知"new-expression将调用operator new
来管理动态存储并同时初始化对象"。我对此毫不怀疑。但我想知道,既然operator new
是在标准库头<new>
中声明的,即使我们不包括头文件,我们怎么还能使用new-expression呢?
operator new
是c++核心语言的一部分还是编译器隐式包含<new>
?
是operator new
是标准的一部分。实现需要在程序中的每个翻译单元的全局作用域中提供操作符。从[basic.stc.dynamic]/2
标准库提供了全局分配和释放函数的默认定义。一些全局分配和重分配函数是可替换的(18.6.1)。一个c++程序最多只能提供一个可替换的分配函数或重分配函数的定义。任何这样的函数定义都将替换库中提供的默认版本(17.6.4.6)。下面的分配和释放函数(18.6)在程序的每个翻译单元的全局作用域中隐式声明:
void* operator new(std::size_t); void* operator new[](std::size_t); void operator delete(void*); void operator delete[](void*); void operator delete(void*, std::size_t) noexcept; void operator delete[](void*, std::size_t) noexcept;
<>共舞,强调我的
这就是为什么你不需要包含任何东西来使用new
/new[]
和delete
/delete[]
。
是的,operator new
是c++标准的一部分。
看到[expr.new] .
大部分#include <new>
是隐式声明的。但是#include <new>
声明了operator new
的一些版本,它们不是隐式的,例如位置new*:
void* operator new (std::size_t size, void* ptr) noexcept;
void* operator new[](std::size_t size, void* ptr) noexcept;
* 不建议日常使用。
我同意,这往往令人困惑,但在c++中有很多新闻(双关语):
- 其中之一是"
- 另一个是"operator
new
"一个实际分配内存的函数 - 有位置
new
- ,有些人可能不喜欢这个名字,但也有数组
new
s (new[]
)
new
操作符"不考虑3,4,因为它们值得自己发布("位置新"有什么用?)和我如何在c++中使用数组?),第一个("new
操作符")驻留在全局命名空间中,并且可以使用范围解析操作符(::
)访问它,第二个是您可以在类中重载的操作符。然而,关于这两者的关系,在MSDN (https://msdn.microsoft.com/en-us/library/kewsb8ba.aspx)中有一个很好的解释,我只是粘贴在这里:
new操作符调用函数operator new。对于任何类型的数组,以及非类、结构或联合类型的对象,调用全局函数::operator new来分配存储空间。类类型对象可以在每个类的基础上定义自己的operator new静态成员函数。当编译器遇到分配type类型对象的new操作符时,它会调用type::operator new(sizeof(type)),或者,如果没有定义用户定义的operator new,则调用::operator new(sizeof(type))。因此,new操作符可以为对象分配正确的内存量。
头文件只提供全局operator new
的所有变体的声明。只要操作符签名正确,您仍然可以在不包含头的情况下重写它们。
默认的分配和释放函数是标准库的特殊组件;它们具有以下独特的属性:
Global:三个版本的new操作符都在全局命名空间中声明,而不是在std命名空间中声明。
隐式:分配版本((1)和(2))隐式声明在c++程序的每个翻译单元中,无论是否包含header。
可替换的:分配版本((1)和(2))也是可替换的:程序可以提供自己的定义,取代默认提供的定义来产生上述结果,或者可以为特定类型重载它。
来源:http://www.cplusplus.com/reference/new/operator%20new/
- C++:如何使函数只返回作为列表一部分的字符串
- 不同语言中相同代码的不同行为
- std::sort()函数无法对向量的一部分进行排序
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- r语言 - C++ 类型为"const std ::?
- 通用C++/Python 多语言的存在
- 为什么我的 EnumWindowProc 不能用 C 语言编译?
- 了解算法的性能差异(如果以不同的编程语言实现)
- Rextester 语言编译C++问题
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 如何将多种语言设置放在单个 .clang 格式文件中
- 不同语言中的模运算符差异
- 反转整数的一部分(一半)的函数
- 刚接触C++,难以理解语言的细微差别
- 为什么开发人员将C / C ++用于嵌入式系统,而不是像Python这样的高级语言与C相比?
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 语言的哪一部分禁止更改 std::set 的元素
- 为什么nullptr是核心语言的一部分,而nullptr_t是STL的一部分?
- ' operator new '是否是c++核心语言的一部分?
- r语言 - 编辑GBM源代码,C++代码的一部分