如何释放局部变量所拥有的资源?

时间:2012-08-15 11:43:18

标签: c++ qt

程序中的某些功能需要运行很长时间,以便用户可以中断它。结构是这样的:

int MainWindow::someFunc1()
{
    //VP is a class defined somewhere.
    VP vp1;
    //the for loop that needs time to execute.
    return 0;
}

int MainWindow::someFunc2()
{
    VP vp2;
    //another loop that consumes time.
    return 0;
}

如果用户同时运行其中一个函数并单击右上角的exit,程序仍将在后台运行,直到循环结束。我试图释放void closeEvent(QCloseEvent *)中的资源:

void MainWindow::closeEvent(QCloseEvent *)
{
    vp.stopIt();
}

但是由于vp1和vp2是局部变量,我不知道如何将它们传递给closeEvent()函数和free资源。任何建议将不胜感激。

4 个答案:

答案 0 :(得分:4)

由于变量是在堆栈上创建的,因此它们将在其范围的最后自动释放(在您的情况下,在函数的结束}处),您不必担心它们。

如果你想在函数结束之前释放它们,你需要重新实现这些函数,并且可能在函数之外自己为这些变量分配和释放内存。将它们传递给函数的方式(将它们作为函数参数传递,或将它们包含在类中)取决于您。

答案 1 :(得分:3)

你做不到。您应该在vp1中将vp2MainWindow声明为成员变量。

答案 2 :(得分:2)

据我了解OP的要求,他正在研究如何在主窗口关闭时中断someFunc1someFunc2

这些函数在GUI线程中运行,因此以下语句是一种误解

  

程序仍将在后台运行,直到循环结束

实际发生的情况是,程序运行直到函数完成,然后框架处理用户操作。因此,执行void MainWindow::closeEvent时,后台没有运行任何内容,资源已被释放。

OP应该将someFunc1someFunc2移动到工作线程。

答案 3 :(得分:0)

理论上 ,您可以使用setjmp执行此操作。这些方面的东西:

#include "setjmp.h"

jmp_buf doNotAttempt;
jmp_buf badPractice;

int MainWindow::someFunc1()
{
    VP vp1;
    for (...) {
        // do stuff
        if (setjmp(doNotAttempt)) { /*free resources, then: */ longjmp(badPractice,1); }
    }
    return 0;
}

// [...]

void MainWindow::closeEvent(QCloseEvent *)
{
    if (!setjmp(badPractice))
        longjmp(doNotAttempt,1);
    else
        // do the same for your other loop
}

在实践中,不要这样做 - 出于各种原因,这是一个糟糕的主意。正如其他人所说,只需将vp1和vp2声明为成员变量。