我刚读过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;
}
我的问题是:
myclass* p3 = new myclass
相当于myclass* p3 = new myclass()
?因为他们有不同的目的。如果你不希望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)其中一些仅用于特定的异常情况。无论如何,普通的旧传统是最好的,大部分时间是:
X * x = new X();
2)是的,他们是。如果构造函数没有参数,则括号是可选的。如果你宣布一个自动变量 - 即
X x;
那么你必须省略括号,或者它是一个函数声明!因此,很多人会告诉你在new
表达式中省略它们。我认为这是一个很好的做法,但我只是习惯于将它们包括在内。
而不是“最佳实践”,你需要在不同的情况下。例如,大多数人只想调用new x()
来分配一些内存并创建对象。但是,有时你会遇到new
失败时不想抛出异常的情况,所以你调用new (nothrow)
来取回null。
如果您已经分配了一些内存但需要创建一个对象,则可以通过调用new (p3) x
来使用“placement new”。
在极少数情况下,您需要使用类的内存分配器但不实际创建对象,您可以使用(myclass*) operator new (sizeof(myclass))
语法。
以下是我的建议:
new
;尽可能通过引用传递。 (避免内存泄漏)。operator new
:x = new X(); // Remember to use delete
std::vector
阵列new
:x = new X()[quantity]; // Remember to use delete []
new
。通常,placement new用于从特定地址或特殊内存池进行分配。这是一个高级主题。