这个问题可能是重复的。我在网上到处找,但是我什么也找不到。'new‘和’*new‘有什么区别?
int main()
{
class Cat
{
//Code
}
new Cat();
*new Cat();
return 0;
}发布于 2013-04-20 22:57:44
这不是两件独立的事情。既没有new也没有*new。第二种方法是对new Cat()的结果简单地应用一元*。
new Cat()是一种新的表达式。它动态分配和初始化一个Cat对象,并将其计算为指向该对象的指针。如果随后对指针应用一元*,则可以取消对其引用以获得Cat对象。
通常没有一个很好的理由将一元*立即应用于新表达式。原因是因为您紧跟指针,而没有将指针存储在任何地方。考虑一下,如果你这样做了:
Cat c = *new Cat();这将导致内存泄漏,您无法从中恢复。动态分配Cat对象,然后将其复制到c中。动态分配的Cat现在仍然存在,并且您没有指向它的指针,您可以通过它来delete对象。这是非常糟糕的。
Cat& c = *new Cat();这要好一点,因为至少现在c只是对动态分配的对象的引用。您可以随时执行delete &c;来销毁对象。但是,它掩盖了Cat是动态分配的事实。如果我正在阅读这段代码,我不会期望c引用一个动态分配的对象。
您必须记住销毁动态分配的对象。取消引用new-expression的结果会使其更难实现,因此应避免这种情况。
发布于 2013-04-20 22:58:25
此表达式:
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表达式创建的对象将丢失,从而再次导致内存泄漏。
在现代C++中,建议避免通过调用new和delete进行手动内存管理;相反,应考虑使用智能指针(这取决于您需要的所有权策略)。例如:
#include <memory>
// ...
std::shared_ptr<Cat> pCat = std::make_shared<Cat>();当指向所指向对象的最后一个智能指针被销毁时,智能指针负责自动销毁被引用的对象。
发布于 2013-04-20 22:59:07
这对你有帮助吗:
Cat *ptr = new Cat();
Cat cat = *new Cat(); /* memory leak :( */https://stackoverflow.com/questions/16121715
复制相似问题