在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 - 资源获取是初始化。
关于堆与栈的最佳讨论之一是我看到的是:堆与堆栈(向下滚动到讨论的中间)
简短的摘要:
上一篇: Variable creation on heap or stack in C++
下一篇: Iteration over std::vector: unsigned vs signed index variable