”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > C++ 对象实例化:堆栈与堆:“new”还是不是“new”?

C++ 对象实例化:堆栈与堆:“new”还是不是“new”?

发布于2024-12-21
浏览:146

C   Object Instantiation:  Stack vs. Heap: `new` or Not `new`?

实例化对象:有或没有New

在C中创建对象时,程序员可以使用“new”运算符或直接实例化它们没有它。虽然这两种方法都创建对象,但它们在几个关键方面有所不同。

不带 New

实例化一个不带“new”的对象会直接在当前作用域中为其保留内存。这通常在堆栈上完成,并产生具有自动生命周期的对象。对象在其定义的范围内自动创建和销毁。

例如:

Time t(12, 0, 0); // t is a Time object

在上面的代码中,“Time”对象“t”是在堆栈上创建的,并且它的生命周期绑定到当前作用域。

With New

使用“new”实例化一个对象,在堆上为其动态分配内存。这允许在对象的生命周期结束时显式地创建和销毁该对象。指针“t”存储的是对象的堆地址。

例如:

Time* t = new Time(12, 0, 0); // t is a pointer to a dynamically allocated Time object

这里,指针“t”被赋予了新创建的“Time”对象的堆地址。对象的生命周期与范围无关,并且一直持续到使用“删除”运算符释放其内存为止。

主要区别

  • 内存分配: 没有“new”创建的对象在堆栈上分配内存,而“new”在堆栈上分配内存heap.
  • Lifetime:没有“new”实例化的对象具有自动生命周期,而用“new”创建的对象具有动态生命周期,必须手动删除。

值得注意的是,这些差异是特定于实现的,因为 C 标准没有明确定义堆栈和堆行为。然而,在大多数实际实现中,堆栈内存用于自动对象,而堆内存用于动态对象。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3