我正在编写一个与USB视频播放 Controller 交互的用户空间程序。我使用C++进行编程,该程序旨在在Linux上运行。在研究libusb手册时,我遇到了void libusb_exit ( struct libusb_context * ctx )函数。

描述says:



该手册没有说明为什么需要它。我对终止已初始化并使用libusb的程序而不调用libusb_exit()的后果感到好奇。如果由于某些原因我的程序在终止之前无法调用libusb_exit(),有人可以解释会发生什么不好的事情吗?会导致系统资源泄漏吗?

最佳答案

它涉及上下文。

就单个用户应用程序而言,通常最终会使用默认上下文。每当用户 session 被破坏(即可能要关闭您的应用程序)时,该消息就会死亡。
还请注意,您不能仅仅因为应用程序崩溃而不会调用libusb_exit来泄漏(好吧,即使可能发生泄漏,泄漏的内存也将在崩溃后立即释放,因此,我只关心有关崩溃本身的原因)。

每当您有多个 session 时,就会出现此问题。
有关更多详细信息,请参见herehere
如果在这种情况下调用libusb_exit失败,并且从应用程序的角度来看 session 处于释放状态,则肯定会泄漏内存,因为该上下文实际上不会被libusb破坏。实际上,在这种情况下,该软件不是要关闭的,而是该内存仍在使用中,并且不再可访问,因为您没有调用libusb_exit来释放它。

这就是为什么文档建议您每次要破坏上下文时都调用libusb_exit,无论默认上下文是不是。

10-07 20:15