首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >*new和new的C++区别

*new和new的C++区别
EN

Stack Overflow用户
提问于 2013-04-20 22:56:48
回答 3查看 460关注 0票数 3

这个问题可能是重复的。我在网上到处找,但是我什么也找不到。'new‘和’*new‘有什么区别?

代码语言:javascript
运行
复制
int main()
{
    class Cat
    {
        //Code
    }

    new Cat();
    *new Cat();

    return 0;
}
EN

回答 3

Stack Overflow用户

发布于 2013-04-20 22:57:44

这不是两件独立的事情。既没有new也没有*new。第二种方法是对new Cat()的结果简单地应用一元*

new Cat()是一种新的表达式。它动态分配和初始化一个Cat对象,并将其计算为指向该对象的指针。如果随后对指针应用一元*,则可以取消对其引用以获得Cat对象。

通常没有一个很好的理由将一元*立即应用于新表达式。原因是因为您紧跟指针,而没有将指针存储在任何地方。考虑一下,如果你这样做了:

代码语言:javascript
运行
复制
Cat c = *new Cat();

这将导致内存泄漏,您无法从中恢复。动态分配Cat对象,然后将其复制到c中。动态分配的Cat现在仍然存在,并且您没有指向它的指针,您可以通过它来delete对象。这是非常糟糕的。

代码语言:javascript
运行
复制
Cat& c = *new Cat();

这要好一点,因为至少现在c只是对动态分配的对象的引用。您可以随时执行delete &c;来销毁对象。但是,它掩盖了Cat是动态分配的事实。如果我正在阅读这段代码,我不会期望c引用一个动态分配的对象。

您必须记住销毁动态分配的对象。取消引用new-expression的结果会使其更难实现,因此应避免这种情况。

票数 17
EN

Stack Overflow用户

发布于 2013-04-20 22:58:25

此表达式:

代码语言:javascript
运行
复制
new Cat();

动态创建一个Cat类型的对象,而您忽略了返回的指针(没有存储它,没有取消引用,什么都没有)。此表达式:

代码语言:javascript
运行
复制
*new Cat();

执行与上面相同的操作,不同之处在于还取消了对new返回的指针的引用。但是取消引用指针本身就是一个没有副作用的操作。

因此,具体地说,两个表达式的效果是相同的。重要的一点是,由于丢失了对动态创建的对象的一个且唯一的引用,会两次内存泄漏。

请记住,使用new创建的每个对象都必须通过相应的delete调用来销毁。例如,如果您以这种方式存储返回的指针:

代码语言:javascript
运行
复制
Cat* pCat = new Cat();

这将允许您稍后执行以下操作:

代码语言:javascript
运行
复制
delete pCat;

并避免内存泄漏。此外,还有以下内容:

代码语言:javascript
运行
复制
Cat& cat = *new Cat();

将允许您稍后执行以下操作:

代码语言:javascript
运行
复制
delete &cat;

并避免再次发生内存泄漏。但是,请注意,这不是一个选项:

代码语言:javascript
运行
复制
Cat cat = *new Cat();

以上操作仍然会导致内存泄漏。原因是它会将通过将new返回的指针解引用到cat中而获得的对象进行复制。换句话说,cat将是一个与new表达式创建的对象不同的对象(尽管与之相同)。

另一方面,由new表达式创建的对象将丢失,从而再次导致内存泄漏。

在现代C++中,建议避免通过调用newdelete进行手动内存管理;相反,应考虑使用智能指针(这取决于您需要的所有权策略)。例如:

代码语言:javascript
运行
复制
#include <memory>

// ...

std::shared_ptr<Cat> pCat = std::make_shared<Cat>();

当指向所指向对象的最后一个智能指针被销毁时,智能指针负责自动销毁被引用的对象。

票数 12
EN

Stack Overflow用户

发布于 2013-04-20 22:59:07

这对你有帮助吗:

代码语言:javascript
运行
复制
Cat *ptr = new Cat();
Cat cat = *new Cat(); /* memory leak :( */
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16121715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档