新的和新的C ++区别
这个问题在这里已经有了答案:
这些不是两个单独的事情。 没有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 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>();
当指向对象的最后一个智能指针被销毁时,智能指针会自动销毁引用的对象。
它有助于你吗?
Cat *ptr = new Cat();
Cat cat = *new Cat(); /* memory leak :( */
链接地址: http://www.djcxy.com/p/13801.html
上一篇: C++ Difference between *new and new
下一篇: C++: Is it ever absolutely necessary to allocate memory manually?