带和不带“的对象定义差异”;新"; 我是C++初学者。我找到了两种定义对象的方法

带和不带“的对象定义差异”;新"; 我是C++初学者。我找到了两种定义对象的方法,c++,C++,演示d Demo*ptrD=newdemo() cpp中的上述两个对象定义之间是否有任何差异 Demo在哪里是一个类 class Demo { // -------------- //--------------- }; 分配给这两条语句创建的对象的内存有什么不同吗?区别在于写入Demo d导致自动创建和销毁对象实例(也称为),而在第二种情况下,您必须担心它。在第一种情况下: Demo d; 对象将在堆栈上被分配,一旦声明的范围离开,对

演示d

Demo*ptrD=newdemo()

cpp中的上述两个对象定义之间是否有任何差异

Demo在哪里是一个类

 class Demo 
    {
         // --------------
         //---------------
    };

分配给这两条语句创建的对象的内存有什么不同吗?

区别在于写入
Demo d导致自动创建和销毁对象实例(也称为),而在第二种情况下,您必须担心它。

在第一种情况下:

Demo d;
对象将在堆栈上被分配,一旦声明的范围离开,对象将被自动删除

在第二种情况下:

Demo *d = new Demo();
对象将通过空闲存储/堆进行分配。您需要通过调用
delete
操作符显式删除对象。

当然。 第一个是从堆栈创建和分配的对象。它的作用域结束时将自动删除。 也就是说:

  • 您不能将其作为指针或引用返回,因为这样您将返回一个不指向有效对象的内存地址
  • 如果您返回它,它将作为“复制”或“移动”返回
  • 您不必担心内存泄漏,因为它是自动取消分配的
  • 分配它比另一种堆分配要快得多
  • 第二个是从堆中分配的。堆是操作系统提供给您的一个巨大内存块。也就是说:

    • 分配了new的对象将一直存在,直到您对其调用
      delete
    • 它的范围对程序来说是通用的
    • 您必须将其作为指针或引用传递(无论如何,您应该这样做)
    • 你必须在某一点上删除它
    • 堆分配较慢
    • 内存泄漏的危险更大
    还有许多其他的新功能,包括polimorphism、多线程环境等等。
    了解内存管理,知道它是你的掌心,但选择
    unique\u ptr
    shared\u ptr
    ,时间一到

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


    对于
    Demo*d=newdemo()
    d
    是指向堆上分配的对象的指针。在使用
    delete
    操作符显式释放之前,这些对象一直存在:
    delete d

    它应该是Demo*ptrd=new Demo()
    new
    动态分配内存,而第一个示例静态分配内存。其他人:@Sumeet不,不应该。没有必要这样做。有些人认为这是一种很好的做法,但我个人不同意。@Nallath:这家伙写了Demo d=new Demo();,在最初的职位。我发了帖子,这样他就可以更正了。
    新演示()中的
    ()
    是一个初始值设定项,在一般情况下,这也会在这两个变体之间产生额外的差异。如果您想将问题限制在存储和使用寿命方面,最好先消除这种差异。
    Demo-dvs.
    新演示
    演示{}
    vs
    新演示{}