Pau*_*eny 44 c++ include standard-library new-operator
根据运营商新的参考条目(http://www.cplusplus.com/reference/std/new/operator%20new/):
全局动态存储操作员功能在标准库中是特殊的:
- operator new的所有三个版本都在全局命名空间中声明,而不是在std命名空间中声明.
- 第一个和第二个版本在C++程序的每个翻译单元中隐式声明:不需要包含标题以使它们存在.
在我看来,这意味着在C++程序的每个翻译单元中都没有隐式声明第三版operator new(placement new),<new>并且需要包含标题才能使它存在.那是对的吗?
如果是这样,如何使用g ++和MS VC++ Express编译器,我似乎可以#include <new>在我的源代码中使用第三版new编译代码?
另外,关于operator new的MSDN标准C++库参考条目为包含该#include <new>语句的三种形式的operator new提供了一些示例代码,但是如果没有这个包含,该示例似乎对我来说编译和运行相同?
// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>
using namespace std;
class MyClass
{
public:
MyClass( )
{
cout << "Construction MyClass." << this << endl;
};
~MyClass( )
{
imember = 0; cout << "Destructing MyClass." << this << endl;
};
int imember;
};
int main( )
{
// The first form of new delete
MyClass* fPtr = new MyClass;
delete fPtr;
// The second form of new delete
char x[sizeof( MyClass )];
MyClass* fPtr2 = new( &x[0] ) MyClass;
fPtr2 -> ~MyClass();
cout << "The address of x[0] is : " << ( void* )&x[0] << endl;
// The third form of new delete
MyClass* fPtr3 = new( nothrow ) MyClass;
delete fPtr3;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以对此有所了解,以及何时以及为什么你可能需要#include <new>- 可能是一些不能编译的示例代码#include <new>?
谢谢.
Abh*_*hay 14
C++标准第3.7.4.2节说: -
该库提供全局分配和释放功能的默认定义.一些全局分配和释放功能是可替换的(18.6.1).C++程序最多只能提供一个可替换分配或释放功能的定义.任何此类函数定义都将替换库中提供的默认版本(17.6.3.6).以下分配和释放函数(18.6)在程序的每个转换单元中在全局范围中隐式声明.
void* operator new(std::size_t) throw(std::bad_alloc);
void* operator new[](std::size_t) throw std::bad_alloc);
void operator delete(void*) throw();
void operator delete[](void*) throw();
Run Code Online (Sandbox Code Playgroud)
这些隐式声明仅引入函数名称operator new,operator new [],operator delete,operator delete [].[注意:隐式声明不会引入名称std,std :: bad_alloc和std :: size_t,或者库用于声明这些名称的任何其他名称.因此,在不包括头部的情况下引用这些函数之一的newexpression,delete-expression或函数调用是格式良好的.但是,引用std,std :: bad_alloc和std :: size_t是不正确的,除非通过包含适当的头声明了名称. - 尾注]
此外,std::nothrow版本operator new需要包含标题.该标准虽然未指定在其他头文件中隐式包含头文件.因此,当std::bad_alloc引用名称等时,遵循标准是安全和便携的.
小智 11
C++中没有任何内容可以防止标准头文件包含其他标准头文件.因此,如果您包含任何标准标题,您可能会间接地包含所有标准标题.但是,此行为完全取决于实现,如果您需要特定标头的功能,则应始终自行明确包含它.
关于标题中的问题,
”
#include <new>C ++ 何时需要库?
关键字new可以以多种方式使用。普通使用不需要包含任何标题。但是,使用此关键字的一种可能方法是调用<new>标头定义的特定“ placement new”功能。使用该用法时,您需要直接或间接包括<new>标题。除非您需要,否则不要包含该标头或任何其他标头;默认情况下不包含标题。另一方面,不要依赖于实现的特定版本的标头,包括另一个标头:始终按照标准(或其他)标头提供的内容包括所需的标头。
关于体内的问题,
”的例子似乎编译并没有这个运行只是我同样包括哪些内容?
在C ++中,根据实现的情况,允许标准库标头包括其他标准库标头(或其他标准库标头提供的内容)。
| 归档时间: |
|
| 查看次数: |
28294 次 |
| 最近记录: |