5

我试图在 C++ 程序中节省一些内存,我想知道是否可以使用块作为变量的范围(如在 Perl 中)。假设我有一个巨大的对象,它执行一些计算并给出结果,这样做是否有意义:

InputType  input;
ResultType result;

{
    // Block of code
    MyHugeObject mho;
    result = mho.superHeavyProcessing();
}

/*
   My other code ...
*/

我可以期望对象在退出块时被销毁吗?

4

4 回答 4

25

是的你可以。

一旦变量超出范围,析构函数就会被调用,它应该释放堆分配的内存。

于 2009-02-24T09:36:13.353 回答
18

绝对是的,除了节省内存之外,在范围退出时调用析构函数通常用于您希望析构函数在调用析构函数时实际执行某些操作(请参阅 RAII)。例如,创建一个基于范围的锁并以异常安全的方式轻松释放它,或者确定性地放弃对共享或宝贵资源(如文件句柄/数据库连接)的访问。

-瑞克

于 2009-02-24T09:41:13.887 回答
3

请记住,您使用在析构函数中释放的 new/malloc 在堆上分配的任何内存可能不会被释放回操作系统。您的进程可能会保留它,并且操作系统在进程终止之前不会将其取回。

于 2009-02-24T10:49:17.967 回答
2

是的。它将在右花括号处被销毁。但要注意在堆栈上分配非常大的对象。这会导致堆栈溢出。如果您的对象还分配大量内存,请确保它是用 new、malloc 或类似方法分配的堆。

于 2009-02-24T16:32:32.040 回答