我正在编写一个与USB视频播放 Controller 交互的用户空间程序。我使用C++进行编程,该程序旨在在Linux上运行。在研究libusb手册时,我遇到了void libusb_exit ( struct libusb_context * ctx )
函数。
描述says:
该手册没有说明为什么需要它。我对终止已初始化并使用libusb的程序而不调用libusb_exit()
的后果感到好奇。如果由于某些原因我的程序在终止之前无法调用libusb_exit()
,有人可以解释会发生什么不好的事情吗?会导致系统资源泄漏吗?
最佳答案
它涉及上下文。
就单个用户应用程序而言,通常最终会使用默认上下文。每当用户 session 被破坏(即可能要关闭您的应用程序)时,该消息就会死亡。
还请注意,您不能仅仅因为应用程序崩溃而不会调用libusb_exit
来泄漏(好吧,即使可能发生泄漏,泄漏的内存也将在崩溃后立即释放,因此,我只关心有关崩溃本身的原因)。
每当您有多个 session 时,就会出现此问题。
有关更多详细信息,请参见here和here。
如果在这种情况下调用libusb_exit
失败,并且从应用程序的角度来看 session 处于释放状态,则肯定会泄漏内存,因为该上下文实际上不会被libusb破坏。实际上,在这种情况下,该软件不是要关闭的,而是该内存仍在使用中,并且不再可访问,因为您没有调用libusb_exit
来释放它。
这就是为什么文档建议您每次要破坏上下文时都调用libusb_exit
,无论默认上下文是不是。