什么时候C++需要#include <new>库?

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>,编译好的最可能的解释是我包含的其他头文件本身包含了<new>库吗?如果我正确理解你的答案,那将解决我的困惑,似乎是合理的. (2认同)
  • ~Czarak Yup.例如,在GCC实现中,我使用标题`<functional>`包含`<new>` - 可能还有其他标题. (2认同)
  • **-1 **这不能回答标题“何时在C ++中需要#include &lt;new&gt;库”的问题。我想这对OP来说是可以的。但是,当这个问题被用作其他问题的近似重复时,就会出现问题。 (2认同)

Che*_*Alf 6

关于标题中的问题,

#include <new> C ++ 何时需要库?

关键字new可以以多种方式使用。普通使用不需要包含任何标题。但是,使用此关键字的一种可能方法是调用<new>标头定义的特定“ placement new”功能。使用该用法时,您需要直接或间接包括<new>标题。除非您需要,否则不要包含该标头或任何其他标头;默认情况下不包含标题。另一方面,不要依赖于实现的特定版本的标头,包括另一个标头:始终按照标准(或其他)标头提供的内容包括所需的标头。

关于体内的问题,

的例子似乎编译并没有这个运行只是我同样包括哪些内容?

在C ++中,根据实现的情况,允许标准库标头包括其他标准库标头(或其他标准库标头提供的内容)。