【问题标题】:Are destructors called if the program is closed manually?如果程序手动关闭,是否会调用析构函数?
【发布时间】:2019-07-04 09:46:44
【问题描述】:

我有一个类,在它的一个函数中我使用 memset 分配内存,然后程序进入一个循环,但我的问题是,即使我在析构函数中设置了 delete[],如果我关闭程序单击 X 会调用析构函数并释放内存吗?还是漏水了?

class Example {
public:
    int *a;
    Example() {
        a = new int[100];
        memset(a, 0, sizeof(a)); //Allocating memory
    }

    ~Example() {
        delete[] a;
    }
};

int main() {
    Example(); //Memory allocated.
    while (true) {
        //Other code here, if i close the program now (Pressing X), will the memory be liberated?
    }
    return 0;
}

【问题讨论】:

  • “点击X”是什么意思?
  • @eerorika Windows 应用程序中的右上角按钮,用于关闭程序。即铬,即Windows 资源管理器等
  • 这将取决于实现、应用程序和操作系统。
  • Example(); 创建一个未使用的 R 值。因此,在您进入循环之前,会在行尾立即调用析构函数。你的意思是auto v=Example();Example v; 之类的吗?
  • 这个问题的文字强调内存泄漏,而标题没有提到这一点。您对哪个方面更感兴趣——如果调用了析构函数,或者程序终止后内存是否泄漏? (后者比前者有一个更简单、独立于语言的答案。)

标签: c++ windows memory destructor


【解决方案1】:

既然您提到“X”,我假设您是在谈论 Windows 应用程序。 Linux 很可能类似,但对于其他操作系统和 ekbedded 系统,您的情况可能会有所不同。

现在,关于 Windows。简短的回答是 - 关闭您的应用程序会自动释放其所有内存。事实上,操作系统比你的应用程序更高效,所以如果你知道你的应用程序正在关闭,你可以跳过所有的析构函数和内存释放等。你会节省时间。无论如何,操作系统都会为你做这件事。关闭任何文件、网络套接字、内核句柄、窗口等也是如此。操作系统会一举丢弃属于您的进程的所有内容。

【讨论】:

  • 这与调用析构函数不同。
  • @NeilButterworth 是的,但 OP 最关心的是内存泄漏。
【解决方案2】:

如果我通过单击 X 关闭程序,会调用析构函数并释放内存吗?

不,该内存不会被自动释放。可能有一些方法可以在您的程序中放置钩子,让您在程序终止之前进行一些清理,但默认情况下它不会到位。

或者它的泄漏?j

当程序终止时,大多数运行时系统会确保该程序使用的内存可供其他程序使用。从这个意义上说,内存没有泄漏,但从单个程序的角度来看,内存正在泄漏。

附言

请注意,我是从主流台式机/笔记本电脑用户的角度发言。嵌入式系统的行为可能完全不同。

【讨论】:

    猜你喜欢
    • 2021-04-24
    • 2015-12-03
    • 2012-03-18
    • 2011-01-31
    • 1970-01-01
    • 2014-01-15
    • 2011-05-14
    相关资源
    最近更新 更多