使用和不使用" new"对象定义的差异

时间:2015-09-02 13:39:46

标签: c++

我是C ++的初学者。我发现了两种对象定义方式。

  

演示d;

     

Demo * ptrD = new Demo();

cpp

中上述两个对象定义之间是否有任何区别?

其中Demo是一个类

error

分配给这两个语句创建的对象的内存是否存在差异?

4 个答案:

答案 0 :(得分:1)

当然。 第一个是从堆栈创建和分配的对象。它的范围结束后将自动删除。 有人说:

  1. 你不能将它作为指针或引用返回 - 因为那样你将返回一个不指向有效对象的内存地址
  2. 如果您将其退回,则会以复制或移动方式返回
  3. 你不必害怕内存泄漏,因为它是自动解除分配
  4. 分配它比替代堆分配快得多
  5. 第二个是从堆中分配的。堆是操作系统为您提供的巨大内存块。有人说:

    • 分配有新内容的对象将一直存在,直到您在其上调用delete
    • 它的范围是程序的通用
    • 你必须将它作为指针或参考传递(好吧,你应该,无论如何)
    • 你必须delete某点
    • 堆分配较慢
    • 内存泄漏的危险性更大

    还有许多其他的轩辕,包括polimorphism,多线程环境等等。 了解记忆管理,将其视为掌握,但请及时选择unique_ptrshared_ptr

答案 1 :(得分:1)

对于Demo d; d将在堆栈上分配,并在程序离开当前块时自动释放。

对于Demo *d = new Demo(); d是指向堆上分配的对象的指针。此类对象保持存在,直到使用delete运算符明确释放:delete d

答案 2 :(得分:0)

不同之处在于,写Demo d;会导致自动创建和销毁对象实例(也称为RAII),而在第二种情况下,您必须担心它。

答案 3 :(得分:0)

在第一种情况下:

Demo d;

对象将在堆栈​​上分配,并在声明范围保留后自动删除。

在第二种情况下:

Demo *d = new Demo();

该对象将通过免费存储/堆分配。您需要通过调用delete运算符来显式删除对象。