我刚读过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()
?答案 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)
以下是我的建议:
new
;经过
尽可能参考。 (避免内存泄漏)。operator new
:x = new X(); // Remember to use delete
std::vector
到数组new
:
x = new X()[quantity]; // Remember to use delete []
new
你完全知道原因。通常,placement new用于从特定地址或特殊内存池进行分配。这是一个高级主题。