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