显式删除C++中的对象

Deleting objects in C++ explicitly

本文关键字:对象 C++ 删除      更新时间:2023-10-16

我有一个类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,但内存仍然存在。如何释放该内存?

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

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

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

以下是堆栈与堆如何工作的一些示例和解释,让您更好地了解何时需要自己释放内存,何时不需要释放内存。

注意:我使用堆栈和堆的概念只是为了建议如何处理相对于其生存期的对象,例如何时应该释放堆栈中的对象在离开范围后,并且对象一直存在直到它被显式释放。如评论中所述,标准C++中不考虑这些概念,因为程序可以在不支持这些类型内存的环境中运行。尽管编译器尊重C++程序的这些规则。

myclass obj;

每次循环迭代后都会被自动删除。

如何释放该内存?

你不需要。

简短的回答是你不需要。

下面是一个快速示例:

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

如果不动态创建对象,则会在堆栈上创建该对象,并在看到定义其范围的右括号时将其删除。您可以有自己的左括号和右括号来限制变量的作用域。这将有助于从不必要的变量中释放内存。例如

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