在C ++中,如果在方法中创建了一个对象,那么在该方法完成后对象使用的内存是否自动释放?

时间:2011-11-13 23:27:21

标签: c++ memory object scope

在我现在正在处理的代码中,我有一个属于类的方法,该类本身创建了另一个在该方法中使用的对象的实例。在方法返回并且对象失去范围后,属于该对象的内存是否会自动释放?或者每次调用该方法时我会占用越来越多的内存吗?

代码具有以下结构:

int Class::method(int input) {
    Other_Class local_instance;
    int i;

    i = local_instance.do_something();
    i *= input;

    return i;
}

从方法返回时,属于local_instance的内存是否会被释放?或者我会有很多Other_Class堵塞记忆的实例?

非常感谢您的时间和帮助!

6 个答案:

答案 0 :(得分:3)

local_instance对象将在堆栈​​上分配,并且在方法返回时将被销毁(将调用其析构函数)。

答案 1 :(得分:1)

嗯,首先,local_instance 不是Other_Class的对象,而是一个没有参数返回Other_class的函数。这也被称为C ++最令人烦恼的解析。

编辑:问题中的代码已更正;原始版本

Other_Class local_instance();

但我们假设这条线实际上是

Other_Class local_instance; // no parentheses

然后是的,这个对象将在函数结束时自动释放。但请注意,对于使用new分配的对象,为true,对于这些对象,您有责任在不再需要时删除它们。

答案 2 :(得分:1)

假设Other_Class :: ~Other_Class()礼貌地清理了Other_Class在堆上分配的任何内存。

答案 3 :(得分:1)

在C ++中,除非在堆上创建对象,否则将自动释放所有内存。例如,在堆栈上创建了Other_Class,而不是堆,因此返回的函数会自动释放Other_Class。

但是,堆上的对象不会自动释放。相反,开发人员有责任清理堆上的任何内存。

例如,虽然您的代码很好,但此代码会产生内存泄漏:

int main ()
{
   Other_Class *memOnHeap = new Other_Class;
   return 0;
}

在上面的代码中,gcc将允许它编译,但是,你将创建一个与Other_Class对象大小相同的内存泄漏,因为你已经在泄漏上为它分配了内存,但是没有通过调用delete来解除分配。通过在返回主页之前插入delete memOnHeap;,可以轻松解决问题。

答案 4 :(得分:0)

除非使用new运算符在堆上创建对象,否则当对象超出范围时,对象将被销毁并回收内存。

答案 5 :(得分:0)

除了上述所有内容之外,如果对象local_instance的构造函数使用Other_Class*指针指向的new运算符实例化对象。然后,该对象在销毁时不会自动释放在这些操作中分配的内存。即你必须考虑孩子们! (想想自动指针,在析构函数中删除等)。