new vs *new in C++



我这样做:

MyClass myObject = *new MyClass();

但是很多人说我应该这样做:

MyClass *myObject = new MyClass();

是否存在性能差异。或者根本没有使用第二种方法的合理理由?我只是更喜欢使用第一种方法来摆脱指针混淆。

两者不一样!
首先给你一个未定义的行为[Ref 1:]或内存泄漏,而第二不如果你调用delete以后。

MyClass myObject = *new MyClass();

在freestore上分配一个类型为MyClass的对象,然后将该对象复制到myObject。您将丢失指向动态分配对象的指针,因此永远无法释放它。
如果MyClass析构函数有副作用,并且您的程序依赖于这些副作用,那么它会给您未定义行为,如果没有,那么您拥有的是简单的内存泄漏

MyClass *myObject = new MyClass();

在freestore上分配一个类型为MyClass的对象,并将myObject点分配给动态分配对象所在的地址。您仍然拥有指向对象的指针,稍后可以通过调用delete来释放该指针。


如果你的问题是,做这件事的最好方法是什么,
答案是根本不使用动态分配的对象:

MyClass obj;

优秀阅读:

为什么c++程序员应该尽量减少'new'的使用?


<一口> (Ref 1:)
c++ 11标准:3.8.4:

程序可以通过重用对象所占用的存储空间或显式调用具有非平凡析构函数的类类型对象的析构函数来结束任何对象的生命周期。对于具有非平凡析构函数的类类型对象,在对象占用的存储空间被重用或释放之前,程序不需要显式调用析构函数;但是,如果没有显式调用如果没有使用析构函数或delete表达式(5.3.5)来释放存储,则不能隐式调用析构函数,并且任何依赖于析构函数产生的副作用的程序都具有未定义的行为。

第一个例子说:在堆栈上为MyObject的一个实例分配内存,然后在堆上为另一个实例分配内存,在堆上构造一个,将其内容复制到堆栈上的一个,然后失去堆指针的跟踪,因此它不能被释放。

第二个说:在堆栈上分配一个指针,在堆上为MyObject的实例分配空间,构造它,并将指针分配给它的地址,以便稍后释放它。

第二种情况使用更少的内存,更快,并且不会泄漏内存。第一个例子是"我不懂c++"

第一个是废话。

MyClass myObject = *new MyClass();

=之后的部分分配内存并创建一个新的MyClass对象。第一部分通过调用RHS MyClass对象的复制构造函数来创建一个新的MyClass对象。然后在RHS中分配的内存泄漏,因为您没有保存指针来删除它。

上述语句与书写相同。

MyClass myObject;

紧随其后
Leak memory equal to size of MyClass.

首先决定你想要一个对象在堆栈上还是在堆上。

如果你想要一个对象在堆栈上,那么执行

MyClass myObject;

这创建了一个MyClass对象——它可以很好地用于大多数用途。

如果需要在堆上放置对象,则执行

MyClass *myObject = new MyClass();

第一种方法——在堆栈上分配更有效。由于其他原因进行堆分配

  1. 在编译时,你不知道你需要创建多少对象。
  2. 多态使用类

最新更新