在我现在正在处理的代码中,我有一个属于类的方法,该类本身创建了另一个在该方法中使用的对象的实例。在方法返回并且对象失去范围后,属于该对象的内存是否会自动释放?或者每次调用该方法时我会占用越来越多的内存吗?
代码具有以下结构:
int Class::method(int input) {
Other_Class local_instance;
int i;
i = local_instance.do_something();
i *= input;
return i;
}
从方法返回时,属于local_instance
的内存是否会被释放?或者我会有很多Other_Class
堵塞记忆的实例?
非常感谢您的时间和帮助!
答案 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运算符实例化对象。然后,该对象在销毁时不会自动释放在这些操作中分配的内存。即你必须考虑孩子们! (想想自动指针,在析构函数中删除等)。