C++ 什么时候是#包括<;新>;C+中需要的库+;?

C++ 什么时候是#包括<;新>;C+中需要的库+;?,c++,new-operator,include,standard-library,C++,New Operator,Include,Standard Library,根据for操作员新建的: 全局动态存储操作符 函数在标准中是特殊的 图书馆: 运算符new的所有三个版本都在全局命名空间中声明, 不在std名称空间中 第一个和第二个版本在每个 C++程序的翻译单元: 页眉不需要为空 包括让他们在场 这似乎意味着,在C++程序的每个翻译单元中,不隐式声明运算符new < /Cuff>(放置 new >第三个版本,并且需要包含头 ,以便它存在。对吗 如果是这样的话,使用g++和MS VC++Express编译器,我似乎可以使用第三个版本的new编译代码,而不

根据for
操作员新建的

全局动态存储操作符 函数在标准中是特殊的 图书馆:

  • 运算符new的所有三个版本都在全局命名空间中声明, 不在std名称空间中
  • 第一个和第二个版本在每个 C++程序的翻译单元: 页眉不需要为空 包括让他们在场

这似乎意味着,在C++程序的每个翻译单元中,不隐式声明<代码>运算符new < /Cuff>(放置<代码> new <代码> >第三个版本,并且需要包含头<代码> <代码>,以便它存在。对吗

如果是这样的话,使用g++和MS VC++Express编译器,我似乎可以使用第三个版本的
new
编译代码,而不使用
#在我的源代码中包含

<> P< >代码> >运算符new < /COD>中的MSDN标准C++库引用条目给出了三种形式的<代码>运算符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;
}
//new\u op\u new.cpp
//使用:/EHsc编译
#包括
#包括
使用名称空间std;
类MyClass
{
公众:
MyClass()
{

头中定义的cout运算符
new
在无法分配内存时抛出
错误分配
异常(在同一头中声明),而不是返回NULL。
头还定义

void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
不抛出异常和放置新变量的变量。如果没有
,则只会得到纯旧的、返回NULL的
运算符new
。所有三个运算符重载:

void* operator new (std::size_t size) throw (std::bad_alloc);
void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
void* operator new (std::size_t size, void* ptr) throw();

标头中声明。但是,有些编译器可能会隐式地使用它们,但这是非标准的,并且不应该依赖它。

< P> C++中没有任何东西阻止标准头包含其他标准头。因此,如果包含任何标准标头,您可能会间接地将它们全部包含在内。行为完全依赖于实现,如果需要特定的头的特征,则应该始终明确地包含它自己。

< P> C++标准诗句<强> 3.7.4.2 >:--/P> 库为全局分配和解除分配函数提供默认定义。某些全局分配和解除分配函数是可替换的(18.6.1)C++程序最多只能提供一个可替换的分配或解除分配函数的定义。任何这样的函数定义取代了库中提供的默认版本(7.63.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();
这些隐式声明只引入函数名
运算符new
运算符new[]
运算符delete
运算符delete[]
[注意: 隐式声明不引入名称
std
std::bad_alloc
, 和
std::size\u t
,或库用于声明的任何其他名称 这些名称。因此,一个新的表达式,删除表达式或函数 引用其中一个函数而不包括 标题
格式正确。但是,参考
std
std::bad\u alloc
,和
std::size\u t
格式不正确,除非名称已更改 通过包含适当的标题声明。-结束注释]

另外,
std::nothrow
版本的
运算符new
需要包含标头()


但是,该标准没有规定头文件包含在其他头文件中。因此,当引用名称
std::bad_alloc
等时,遵循该标准是安全和可移植的。

关于标题中的问题

<> > <>强> > C++ >

关键字
new
可以以多种方式使用。普通使用不需要包含任何标题。但使用此关键字的一种可能方式是调用特定的“placement 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;
}

在C++标准库头中允许包含其他标准库头(或由其他标准库头提供的内容),由实现自行决定。

相反。抛出new是默认值,nothrow需要包含。我认为是相反的。如果不包含
,则会得到new的异常版本(根据标准,这是默认值)您不需要声明<代码> STD::BADYOLLC/<代码>,只在您想捕获异常时调用No.For,如果您想要NoFrpor版本,则应该包含<代码> <代码>,因为在该标题中定义了代码> STD::Noojs/Cuff>。您是正确的。但是,当C++没有异常时,它是如何工作的?@ Keib怪异C默认C好的,如果我想要抛出版本,所以不包括
,但它是通过其他一些include无意中被包括的呢?而且
std::bad\u array\u new\u length
似乎要求我们包括
,所以我尝试过的代码和编译器(参见ori)