显式删除C++中的对象
Deleting objects in C++ explicitly
我有一个类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
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象