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

问题描述 投票:8回答:4

我刚读过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. 使用new运算符的最佳做法是什么?
  2. myclass* p3 = new myclass相当于myclass* p3 = new myclass()
c++ pointers new-operator
4个回答
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没有任何成员,所以严格来说,你的问题的答案是肯定的。


2
投票

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

X * x = new X();

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

X x;

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


0
投票

而不是“最佳实践”,你需要在不同的情况下。例如,大多数人只想调用new x()来分配一些内存并创建对象。但是,有时你会遇到new失败时不想抛出异常的情况,所以你调用new (nothrow)来取回null。

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

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


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

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

© www.soinside.com 2019 - 2024. All rights reserved.