C++ 为什么在C++;

C++ 为什么在C++;,c++,pointers,new-operator,C++,Pointers,New Operator,我刚读了这本书。本页给出了一个示例,以演示使用新运算符的四种不同方式,如下所示: // operator new example #include <iostream> #include <new> using namespace std; struct myclass {myclass() {cout <<"myclass constructed\n";}}; int main () { int * p1 = new int; // same a

我刚读了这本书。本页给出了一个示例,以演示使用新运算符的四种不同方式,如下所示:

// operator new example
#include <iostream>
#include <new>
using namespace std;

struct myclass {myclass() {cout <<"myclass constructed\n";}};

int main () {

   int * p1 = new int;
// same as:
// int * p1 = (int*) operator new (sizeof(int));

   int * p2 = new (nothrow) int;
// same as:
// int * p2 = (int*) operator new (sizeof(int),nothrow);

   myclass * p3 = (myclass*) operator new (sizeof(myclass));
// (!) not the same as:
// myclass * p3 = new myclass;
// (constructor not called by function call, even for non-POD types)

   new (p3) myclass;   // calls constructor
// same as:
// operator new (sizeof(myclass),p3)

   return 0;
}
//运算符新示例
#包括
#包括
使用名称空间std;
struct myclass{myclass(){cout1)其中有几种仅在特定的、不寻常的情况下使用。不管怎样,在大多数情况下,普通的传统方法是最好的:

X * x = new X();
2) 是的,它们是。如果构造函数没有参数,则括号是可选的。如果要声明自动变量,即


然后你必须省略括号,否则这是一个函数声明!因此,许多人会告诉你在
new
表达式中也要省略括号。我认为这是一个很好的做法,但我只是习惯于包含括号。

因为它们有不同的用途。如果你不想
new
抛出
std::bad\alloc
失败时,您将使用
nothrow
。如果您想在现有存储中分配对象,您将使用placement new…如果您想要原始的未初始化内存,您将直接调用
操作符new
,并将结果强制转换为目标类型

在99%的情况下,
new
的标准用法是
MyClass*c=newmyclass()

关于你的第二个问题:
newobject()
newobject
的形式通常是不相等的。有关详细信息,请参阅。但这确实是吹毛求疵。通常它们是相等的,但为了安全起见,请始终选择
newobject()
;请注意,在这个特定示例中,它们是相等的,因为
MyClass
没有任何成员,所以严格地说,您的问题的答案是肯定的。

而不是“最佳实践”,您在不同的情况下需要它们。例如,大多数人只想调用
new x()
分配一些内存并创建对象。但是,有时您不希望在
new
失败时引发异常,因此您调用
new(nothrow)
以获取空值

如果已经分配了一些内存,但需要创建对象,则可以通过调用
new(p3)x
使用“placement new”


在极少数情况下,您需要使用类的内存分配器,但不实际创建对象,您可以使用
(myclass*)运算符new(sizeof(myclass))
语法。

以下是我的建议:

  • 不喜欢使用
    新建
    ;忽略
    尽可能引用(避免内存泄漏)
  • 使用
    operator new
    x=new x();//记住使用delete
  • 更喜欢
    std::vector
    而不是array
    new
    x=new x()[quantity];//记住使用delete[]
  • 不要使用placement
    new
    ,除非 你绝对知道原因

  • 通常,placement new用于从特定地址或特殊内存池进行分配。这是一个高级主题。

    没有“最佳实践”你必须知道你在做什么,或者你根本不能使用新的东西——许多有用的C++程序可以并且应该不用它来编写。这个线程应该回答你的第二个问题。在你真正需要动态分配时,请使用智能指针。@肖我怀疑英语不是你的第一语言,所以我会重新措辞——没有任何语言。AL指南,它取决于你的代码是由你来做的(C++)不是。一个简单的语言。如果他认为这是混淆的,等待直到发现可以创建一个受保护的抽象虚拟基础纯虚私有析构函数。<代码>新x/COD>不与<代码>新X()相同。对于POD,我可能应该纠正自己:在C++语句中使用<代码>新< /COD>的简单标准方式。
    X x;