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

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;
}

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


使用方法2时:

  • 对象的生命周期超出了函数的范围或
  • 当你调用某个返回指针的函数时,也就是说你正在从一个抽象工厂或类似的地方创建对象。
  • 后一种技术通常用于处理多态,所以你得到的类型实际上可能不是指针的类型,而是从它派生的类。

    无论何时您需要删除返回值,最好通过将其包装在智能指针或其他销毁“自动”销毁的对象中进行处理。

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


    关于堆与栈的最佳讨论之一是我看到的是:堆与堆栈(向下滚动到讨论的中间)

    简短的摘要:

  • 堆栈:对象的生命周期由编译器控制
  • 堆:对象的生命周期由程序员控制
  • 链接地址: http://www.djcxy.com/p/78757.html

    上一篇: Variable creation on heap or stack in C++

    下一篇: Iteration over std::vector: unsigned vs signed index variable