为什么有这么多不同的方法在C ++中使用new运算符

时间:2011-05-13 17:34:23

标签: c++ pointers new-operator

我刚读过new operator explanation on the cplusplus.com。该页面给出了一个示例,演示了使用new运算符的四种不同方法:

// 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;
}

我的问题是:

  1. 使用的最佳做法是什么 新运营商?
  2. myclass* p3 = new myclass是否等同于myclass* p3 = new myclass()

4 个答案:

答案 0 :(得分:6)

因为他们有不同的目的。如果您不希望new在失败时抛出std::bad_alloc,则可以使用nothrow。如果你想在现有存储中分配你的对象,你可以使用placement new ...如果你想要原始的,未初始化的内存,你可以直接调用operator new并将结果转换为目标类型。

99%的案例中new的标准用法为MyClass* c = new MyClass();

关于第二个问题:new Object()new Object表格通常不相同。有关详细信息,请参阅this question and the responses。但真的正在挑剔。通常它们是等价的,但为了安全起见总是选择new Object();请注意,在这个特定的示例中,它们是相同的,因为MyClass没有任何成员,所以严格来说,您的问题的答案是肯定的。

答案 1 :(得分:2)

1)其中一些仅用于特定的异常情况。无论如何,普通的旧传统是最好的:

X * x = new X();

2)是的,他们是。如果构造函数没有参数,则括号是可选的。如果你宣布一个自动变量 - 即,

X x;

然后你必须省略括号,或者它是一个函数声明!因此,许多人会告诉您在new表达式中省略它们。我认为这是一个很好的做法,但我只是习惯将它们包括在内。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

以下是我的建议:

  1. 不想使用new;经过 尽可能参考。 (避免内存泄漏)。
  2. 使用operator newx = new X(); // Remember to use delete
  3. 首选std::vector到数组newx = new X()[quantity]; // Remember to use delete []
  4. 除非使用展示位置 new 你完全知道原因。
  5. 通常,placement new用于从特定地址或特殊内存池进行分配。这是一个高级主题。