在C ++中的堆或堆栈上的变量创建

时间:2010-10-21 12:52:29

标签: c++ class memory

Circle是一个类,使用公共方法GetDiameter()。 以下两组代码之间有什么区别?

Qn1: 方法1 是否为堆栈上的c分配内存(因此无需空闲内存),而方法2 上为c分配内存(需要手动释放内存)?

Qn2:我们何时应该使用方法1或方法2?

方法1:

void Init()
{
 Circle c;
 c.GetDiameter();

 return;
}

方法2:

void Init()
{
 Circle *c = new Circle();
 c->GetDiameter();

 return;
}

7 个答案:

答案 0 :(得分:10)

作为良好编码实践的一般规则,请尽可能使用方法1。 仅当您需要在不同位置存储和/或共享指针时,才应使用方法2。在方法或类中仅在本地使用的所有对象都应放在堆栈中。

答案 1 :(得分:6)

在以下时间使用方法2:

  • 对象的生命周期超出了函数范围的生命周期 或
  • 当你调用一个返回指针的函数时,即你是从抽象工厂或类似的工厂创建对象。

后一种技术通常用于处理多态,因此你获得的类型实际上可能不是指针的类型,而是从它派生的类。

每当你需要删除返回值时,最好通过将其包装在智能指针或其他对象中来处理它,其中它将“自动”发生。

如果在函数结束时要进行清理,理想情况下应该通过使用自动对象(如scoped_ptr或auto_ptr)来完成。这确保即使函数提前终止(例如抛出异常)也会发生清理。这种技术称为RAII - 资源获取是初始化。

答案 2 :(得分:2)

是的,方法1在Stack上分配,因此不需要释放,而方法2在Heap上分配必须被释放。

  1. 如果您不想在功能结束后使用对象
  2. ,请使用Stack
  3. 如果您希望在函数退出后保持对象处于活动状态(如果您保留已分配的地址),请使用堆

答案 3 :(得分:2)

关于堆与堆栈的最佳讨论之一我见过:heap vs. stack(向下滚动到讨论的中间)

简短摘要:

  • 堆栈:对象的生命周期由编译器控制
  • 堆:对象的生命周期由程序员控制
  • 答案 4 :(得分:1)

    方法1:在堆栈上分配的内存。 方法2:堆上分配的内存。 + 作为一般规则,如果使用“new”调用,则必须调用“delete”来释放内存。

    答案 5 :(得分:1)

    你甚至没有开始使用指针,方法2已经有内存泄漏。

    答案 6 :(得分:0)

    堆叠

    • 限制和固定尺寸
    • FirstOut对象生命周期中的Stricked Last(通常限于封闭函数)

    <强>堆

    • 大小通常仅受系统内存大小的限制
    • 手动管理对象生存期

    这意味着对于只有短寿命的小物体来说是理想的。对于大对象或任何具有比创建函数更长的生命周期的对象,需要堆。手动对象生命周期确实意味着如果您不小心,您可能会发生内存泄漏。