问题标签 [atexit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2050 浏览

c - 是否存在不使用全局变量在 atexit 或类似中释放内存的方法?

我正在用 C 开发一个项目,我需要释放分配的内存并在它退出之前关闭所有打开的文件。

我决定实现一个clean函数来完成所有这些工作并调用它,atexit因为有很多可能的退出场景。

问题是atexit不允许我设置带参数的函数,所以我无法发送到clean需要在进程结束时释放的指针。

所以我需要将每个可能需要释放的指针以及可能在程序中保持打开的每个文件都声明为全局变量?(我已经这样做了,但看起来不太好)或者是否存在atexit允许发送参数的类似功能?或者更可能还有另一种我想念的方式?

0 投票
1 回答
387 浏览

c - 将 atexit 注册到嵌套函数会在 gcc 下返回分段错误

a在嵌套函数内部可见,什么会导致分段错误?

0 投票
2 回答
741 浏览

c++ - 捕获 C++ 库崩溃的一致方法

我环顾了不同的站点,除了那些似乎不起作用的站点之外,找不到这个问题的任何答案。正如标题所说,我正试图找到一种方法来捕捉我正在处理的库是否崩溃。我有一个 Root 类,其中包含我在库中拥有的许多管理器样式类的实例,并且它在其析构函数中释放实例。当然,管理人员要对相当多的数据负责,因此如果没有妥善处理这些数据,就有可能出现相当不可接受甚至危险的内存泄漏水平。

我知道,当程序崩溃时,操作系统将为程序释放堆栈空间,但这不包括调用已分配对象的析构函数。它也不包括删除执行期间分配的任何堆,这就是我处理库中大量内存的方式,这可以追溯到广泛的内存泄漏问题。

我在其他网站上遇到的很多答案只是说要使用 注册一个函数atexit(),但如果应用程序崩溃,该函数将不起作用。而且,如上所述,由于崩溃不调用析构函数,因此无法创建一个全局单例来在其被销毁时关闭所有内容,这是我如何处理这个问题的最初想法。我的另一个想法是希望库的最终用户能够采取适当的预防措施以避免崩溃(通过广泛使用异常抛出),但我觉得这违背了良好编码库的想法,坦率地说我认为它要求最终用户处理这个问题。

所以我想我的 TL;DR 问题是这样的:有没有办法通过标准的 C++ 函数或某种管理器类来捕捉库何时崩溃并适当地处理它?

编辑:另外,我真的更喜欢跨平台的方式来处理这个问题。我的代码库大量使用 C++11 的特性,因此我以编程方式将可用编译器限制为最新版本的 GCC 和 Clang。

不仅如此,我还有几个类,比如 Logger,它们会关闭它们到文件系统的流并打印出一些关于退出状态的消息。我还有一个内存跟踪器,它报告任何可能的内存泄漏到文件,但只在它的析构函数中。

0 投票
1 回答
1179 浏览

python - 加入的Python进程不会调用atexit

我认为 Python 进程在终止时会调用它们的 atexit 函数。请注意,我使用的是 Python 2.7。这是一个简单的例子:

我希望这会打印“atexit function run”,但事实并非如此。

注意这个问题: Python process won't call atexit 是类似的,但它涉及以信号终止的进程,答案涉及拦截该信号。这个问题中的进程正在优雅地退出,因此(据我所知)该问题和答案不适用(除非这些进程由于某种信号而退出?)。

0 投票
0 回答
1284 浏览

python - Python 在退出时刷新日志缓冲区

我编写了一个 python 脚本,它执行一个 while 循环,需要键盘中断或系统关闭才能终止。

我希望我的日志文件保存日志输出;当前创建了日志文件,但没有写入任何内容。

下面创建一个输出文件,其中包含我期望的内容:

但是当我将它集成到我的代码中时,日志文件缺少任何内容:

我相信我应该使用atexit来处理这个问题,但是如何处理呢?

感谢您的时间和考虑。

0 投票
0 回答
469 浏览

ruby - 使用 Rspec 在 at_exit 中测试代码

我有一个 ruby​​ 应用程序,除其他外,它需要在退出时关闭一些数据库。为此,我使用该 at_exit方法。代码看起来像这样:

我有所有使用的方法调用的规范,但我希望能够测试at_exit方法内的代码。可能吗?如果是这样,我该如何为此编写规范?

0 投票
1 回答
1474 浏览

python - 退出时执行代码

在我的代码中,我有这样的功能:

set_var设置数据库中包含的变量。

所有这些set_vars 的目的是防止多个实例同时运行。

atexit处理程序在程序被中断时工作正常,Ctrl-C但当它被系统或类似的东西杀死时不能。

我知道signal但它不允许取消处理程序。

我怎么做?或者如何改变结构来实现相同的功能?

0 投票
3 回答
1168 浏览

c++ - C++ 中 .dtors 和 atexit() 之间的区别

.dtors函数 in和调用 using的函数有什么区别atexit()

据我了解,标有((destructor))属性的函数位于.dtors段中,并在退出后调用。同样,使用添加的函数atexit(fctName)被放置在一个数组中,并在正常执行结束后调用。

那么为什么 C++ 在这里提供了两种截然不同的机制呢?有什么不同的事情只能用一个来完成吗?我只能使用动态添加一个函数atexit()吗?

还有哪些首先被调用,函数中.dtors或使用添加的函数atexit()

0 投票
3 回答
2982 浏览

c++ - 如何使用 atexit() 注册非 void 函数?

我正在尝试注册一个函数,该函数返回一个int要在使用该函数的程序结束时调用的atexit()函数。(具体来说,endwin()来自 ncurses 的函数。)

但是由于atexit()需要一个指向void函数的指针,我遇到了一个问题。我尝试了以下方法:

但是似乎不允许static_cast从一个int函数到一个函数。void

我想要完成的事情是否可能,如果是,怎么做?

注意:我愿意忽略函数的返回值。


编辑:我还尝试创建一个 lambda 函数,这似乎可以满足我的要求:

与包装器/转发功能相比,这是一个好的解决方案吗?(除了它需要 C++11 并避免定义一个新函数,其唯一目的只是转发另一个函数。)

0 投票
1 回答
2025 浏览

c++ - 如何在共享库中调用 atexit?

在共享库中,函数 func1() 具有 atexit(terminate_global) 并且此共享库没有“属性((constructor))”和“属性((destructor))”。
因此,程序流程如下:
1) 应用程序使用 dlopen 加载共享库。
2) 应用程序使用 dlsym 调用 func1()。
3) func1() 有 atexit(terminate_global)。
4) func1() 返回。
5) 应用程序调用 dlclose 取消分配库。

在上述步骤中,我没有发现在卸载库时调用了 atexit()。那么,如果在取消分配共享库时必须调用 atexit(),那么正确的方法应该是什么?我应该使用属性((constructor)) 和属性((destructor)) 函数属性导出例程,以便可以调用 atexit 注册函数吗?