我这样做:
MyClass myObject = *new MyClass();
但很多人都建议我这样做:
MyClass *myObject = new MyClass();
第二种方法有性能差异或逻辑上的原因吗?我只是喜欢使用第一种方法来消除指针混淆。
我这样做:
MyClass myObject = *new MyClass();
但很多人都建议我这样做:
MyClass *myObject = new MyClass();
第二种方法有性能差异或逻辑上的原因吗?我只是喜欢使用第一种方法来消除指针混淆。
两者并不相同!
如果你稍后调用delete
,第一个会导致未定义的行为[参考文献1:]或内存泄漏,而第二个则不会。
MyClass myObject = *new MyClass();
在堆上分配一个MyClass
类型的对象,然后将该对象复制到myObject
中。您丢失了指向动态分配对象的指针,因此永远无法将其释放。
如果MyClass
析构函数具有副作用,并且您的程序依赖于这些副作用,则如果没有,则会导致未定义行为,否则就是简单明了的内存泄漏。
MyClass *myObject = new MyClass();
在堆上分配一个MyClass
类型的对象,并将myObject
指向动态分配的对象的地址。您仍然拥有指向该对象的指针,可以通过稍后调用delete
来释放该指针。
如果您的问题是,如何最好地执行此操作,
答案是根本不使用动态分配的对象:
MyClass obj;
好文推荐:
[参考 1:]
C++11 标准:3.8.4:
一个程序可以通过重复使用对象所占据的存储空间或显式调用具有非平凡析构函数的类类型对象的析构函数来结束任何对象的生命周期。对于具有非平凡析构函数的类类型对象,程序不需要在重复使用或释放对象所占据的存储空间之前显式地调用析构函数;但是,如果没有显式调用析构函数或者没有使用delete-expression(5.3.5)释放存储空间,则析构函数将不会被隐式调用,并且任何依赖于析构函数产生的副作用的程序都具有未定义行为。
new
指针上的delete
才会导致UB。也许这个答案需要编辑以详细说明这一点。 - Alok SaveMyClass myObject = *new MyClass();
< p > 在等号后面分配内存并创建新的 MyClass
对象。第一部分通过使用RHS < code > MyClass 对象调用复制构造函数创建一个新的 MyClass
对象。然后,由于您没有保存指向它的指针以进行删除操作,因此RHS中分配的内存泄漏。 < / p >
< p > 上述语句与编写以下内容相同。 < / p >
MyClass myObject;
接下来
Leak memory equal to size of MyClass.
MyClass myObject;
MyClass *myObject = new MyClass();
MyClass myObject;
总是默认构造的。 - Flexodelete &myObject
,那么使用 MyClass& myObject = *new MyClass();
是可以的吗? - John Militer