新的和新的C ++区别

这个问题在这里已经有了答案:

  • 为什么使用'new'导致内存泄漏? 9个答案

  • 这些不是两个单独的事情。 没有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 ++中,建议通过调用newdelete来避免手动内存管理; 相反,请考虑使用智能指针(这取决于您需要的所有权策略)。 例如:

    #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?