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;
}
答案 0 :(得分:10)
作为良好编码实践的一般规则,请尽可能使用方法1。 仅当您需要在不同位置存储和/或共享指针时,才应使用方法2。在方法或类中仅在本地使用的所有对象都应放在堆栈中。
答案 1 :(得分:6)
在以下时间使用方法2:
后一种技术通常用于处理多态,因此你获得的类型实际上可能不是指针的类型,而是从它派生的类。
每当你需要删除返回值时,最好通过将其包装在智能指针或其他对象中来处理它,其中它将“自动”发生。
如果在函数结束时要进行清理,理想情况下应该通过使用自动对象(如scoped_ptr或auto_ptr)来完成。这确保即使函数提前终止(例如抛出异常)也会发生清理。这种技术称为RAII - 资源获取是初始化。
答案 2 :(得分:2)
是的,方法1在Stack上分配,因此不需要释放,而方法2在Heap上分配必须被释放。
答案 3 :(得分:2)
答案 4 :(得分:1)
方法1:在堆栈上分配的内存。 方法2:堆上分配的内存。 + 作为一般规则,如果使用“new”调用,则必须调用“delete”来释放内存。
答案 5 :(得分:1)
你甚至没有开始使用指针,方法2已经有内存泄漏。
答案 6 :(得分:0)
堆叠
<强>堆强>
这意味着对于只有短寿命的小物体来说是理想的。对于大对象或任何具有比创建函数更长的生命周期的对象,需要堆。手动对象生命周期确实意味着如果您不小心,您可能会发生内存泄漏。