这个问题可能重复。我一直在网上寻找这个想法,但我找不到任何东西。 'new'和'* new'之间有什么区别?:
int main()
{
class Cat
{
//Code
}
new Cat();
*new Cat();
return 0;
}
答案 0 :(得分:16)
这些不是两件事。没有new
和*new
。第二种方法是将一元*
应用于new Cat()
的结果。
new Cat()
是 new-expression 。它动态分配和初始化Cat
对象,并计算指向该对象的指针。如果您随后将一元*
应用于该指针,则取消引用它以获取Cat
对象。
通常没有理由将一元*
立即应用于 new-expression 。原因是因为你立即跟踪指针并且没有将指针存储在任何地方。考虑一下你是否这样做了:
Cat c = *new Cat();
这会导致无法恢复的内存泄漏。动态分配Cat
对象,然后将其复制到c
。动态分配的Cat
现在徘徊不前,你没有指向它的指针,通过它可以delete
对象。这非常糟糕。
Cat& c = *new Cat();
这好一点,因为至少现在c
只是对动态分配对象的引用。您始终可以执行delete &c;
来销毁对象。但是,它掩盖了动态分配Cat
的事实。如果我正在阅读此代码,我不希望c
引用动态分配的对象。
您必须记住销毁动态分配的对象。取消引用 new-expression 的结果会使其更难实现,因此请避免使用它。
答案 1 :(得分:12)
这个表达式:
new Cat();
动态创建类型为Cat
的对象,并忽略返回的指针(不存储它,不解除引用,不存在)。这个表达式:
*new Cat();
与上面的相同,除了您还取消引用new
返回的指针。但是取消引用指针本身是一种没有副作用的操作。
请记住,使用new
创建的每个对象都必须通过对delete
的相应调用来销毁。例如,如果以这种方式存储返回的指针:
Cat* pCat = new Cat();
这将允许你以后做:
delete pCat;
避免内存泄漏。另外,这个:
Cat& cat = *new Cat();
稍后会允许你这样做:
delete &cat;
再次避免内存泄漏。但请注意,这不是一个选项:
Cat cat = *new Cat();
上面的内容仍会给你一个内存泄漏。原因是它将复制通过解除引用new
返回的cat
指针获得的对象。换句话说,cat
与new
表达式创建的对象不同(尽管相同)。
另一方面,new
表达式创建的对象将丢失 - 导致内存再次泄漏。
在Modern C ++中,建议通过调用new
和delete
来避免手动内存管理;相反,请考虑使用智能指针(哪一个取决于您需要的所有权政策)。例如:
#include <memory>
// ...
std::shared_ptr<Cat> pCat = std::make_shared<Cat>();
智能指针负责在销毁指向对象的最后一个智能指针时自动销毁引用的对象。
答案 2 :(得分:6)
它对你有帮助吗?
Cat *ptr = new Cat();
Cat cat = *new Cat(); /* memory leak :( */