我正在尝试在C ++程序中节省一些内存,我想知道是否可以使用块作为变量的作用域(如Perl)。假设我有一个巨大的对象执行一些计算并给出结果,这样做是否有意义:
InputType input;
ResultType result;
{
// Block of code
MyHugeObject mho;
result = mho.superHeavyProcessing();
}
/*
My other code ...
*/
退出块时,我可以期望对象被销毁吗?
答案 0 :(得分:25)
是的,你可以。
一旦变量超出范围,就会调用析构函数,它应该释放堆分配的内存。
答案 1 :(得分:18)
是绝对的,除了节省内存之外,通常还会在析构函数调用析构函数时实际执行某些操作时调用析构函数出口上的析构函数(请参阅RAII)。例如,创建基于作用域的锁并以异常安全的方式轻松释放它,或者确定性地放弃访问共享或宝贵资源(如文件句柄/数据库连接)。
-Rick
答案 2 :(得分:3)
请记住,使用在析构函数中释放的new / malloc在堆上分配的任何内存可能都不会释放回操作系统。您的进程可能会保留它,并且在进程终止之前操作系统不会将其恢复。
答案 3 :(得分:2)
是。它会在闭合的大括号上被摧毁。但要注意在堆栈上分配非常大的对象。这可能导致堆栈溢出。如果对象也分配了大量内存,请确保它是使用new,malloc或类似的堆分配的。