2016-04-29 84 views
7

我在寫一個與USB視頻播放控制器交互的用戶空間程序。我使用C++進行編程,並且該程序旨在在Linux上運行。在研究libusb手冊時,我遇到了void libusb_exit (struct libusb_context * ctx)函數。什麼是不調用libusb_exit()的後果

描述says

取消初始化libusb的。

應在關閉所有打開的設備之後並在您的應用程序終止之前調用。

該手冊沒有解釋爲什麼它需要。我對於終止一個已經初始化並使用libusb而沒有調用libusb_exit()的程序的後果感到好奇。如果由於某些原因,我的程序在終止前無法呼叫libusb_exit(),有人可以解釋可能發生什麼壞事嗎?它會導致系統資源泄漏?

回答

3

這是涉及上下文

只要你有一個單一的用戶應用程序,你通常最終會使用默認的上下文。只要用戶的會話被銷燬,那個人就會死亡,這可能是您的應用程序要關閉時。
請注意,如果你的應用程序崩潰(即使泄漏是可能的,泄漏的內存將在崩潰後立即釋放,所以我不會在意,因此你不能泄漏,因爲你不打電話libusb_exit關於這一點比關於崩潰本身的原因更多)。

只要您有多個會話,就會出現問題。
查看herehere瞭解更多詳情。
如果你在這種情況下調用libusb_exit失敗,並且會話在發佈狀態從應用程序的角度來看失敗,那麼肯定會泄漏內存,因爲上下文不會被libusb實際銷燬。實際上,在這種情況下,軟件不會被關閉,但該內存仍在使用中,不再可到達,因爲您沒有調用libusb_exit來釋放它。

這就是爲什麼文檔建議每次要銷燬上下文時調用libusb_exit,這是默認的或不是。

+0

我想你誤解了(或未能解決)這個問題。 IIUC它問爲什麼有必要在終止該過程之前調用'libusb_exit'(再次,IIUC,它實際上不是必需的)。你提到_crashes_令人困惑。如果應用程序_crashes_與完全退出相比,庫如何設法以不同方式處理上下文? – davmac

相關問題