显式删除C ++中的对象

时间:2016-07-10 08:18:56

标签: c++

我有一个班级myclass。 在main函数中,我在每次迭代中创建类型为myclass的对象,并希望在每次迭代后删除它们。我还没有动态创建对象。我可以显式删除它们,因为迭代结束后我不需要它们。

class myclass{
    int value;
    void do_function();
};

int main()
{
    for(int i=0;i<count;i++)
    { 
        myclass obj;
        obj.do_function();
    }
}

一次迭代后不需要对象obj,但内存仍然存在。我怎样才能释放那段记忆?

4 个答案:

答案 0 :(得分:8)

您不必显式删除它们,因为在创建它们时myclass obj;它们是在堆栈上创建的,并在每次迭代后删除。

当程序在对象堆栈上实例化后到达第一个大括号时,它会删除它,在你的情况下:

myclass obj;
obj.do_function();
} // Here the obj is deleted

Here是一些关于堆栈如何工作的示例和解释,以及堆,以便让您在需要自己释放内存时更好地理解,以及何时不需要。

注意:我只使用 stack heap 的概念来建议如何相对于其生命周期处理对象,就像堆栈中的对象在离开后应该被释放一样范围和堆的对象一直存在,直到它被明确释放。正如评论中所提到的,这些概念在标准C ++中不予考虑,因为程序可以在不支持这些类型内存的环境中运行。虽然编译器尊重C ++程序的这些规则。

答案 1 :(得分:2)

每次迭代循环后,

myclass obj;都会自动删除。

  

我如何释放这段记忆?

你不需要。

答案 2 :(得分:2)

简短的回答是你不需要。

这是一个简单的例子:

class myClass {
    public:
        myClass() { cout << "Hello!" << endl; }
        ~myClass() { cout << "Goodbye!" << endl; }
        void do_function() { cout << "Something" << endl; }
};

int main() {
    for (int i=0; i<3; ++i) {
        myClass obj;
        obj.do_function();
    }
}

输出:

Hello!
Something
Goodbye!
Hello!
Something
Goodbye!
Hello!
Something
Goodbye!

您正在堆栈上分配 obj 。每当程序超出范围时,内存将自动从堆栈中释放。

为for循环的每次迭代创建一个范围。或者内部大括号:

for (int i=0; i<3; ++i) { <-- Right there

obj超出了范围:

    obj.do_function();
} <-- Right here

答案 3 :(得分:1)

如果您没有动态创建对象,则会在堆栈上创建对象,并在查看定义其范围的右括号时将其删除。您可以拥有自己的开始和结束括号来限制变量的范围。这对于从不必要的变量中释放内存是有帮助的。例如

for(...)
{
    //do something
    {
        myclass obj;
        /// use obj here
    }//obj is deleted from stack
    //do something which doesnt require myclass obj
}