2017-07-13 106 views
-1

我一直在寫代碼,並且我正處於一個應該調用我的庫的另一個程序的地步。我應該爲我的圖書館的輸出做一個參考計數器。我已經理解的基本概念是,我需要在我的結構中引用計數器結構,我想傳遞。所以我的問題如下:什麼是參考計數器,它是如何工作的?

  1. 在製作參考計數器時我應該記住什麼?

  2. 製作參考櫃檯時有什麼不完整的事情?

  3. 真的有詳細的例子從哪裏開始呢?

非常感謝您的回答!

+0

不明白你在說什麼時,正確地處理這個.. ..「輸出參考計數器」??? –

+2

您確定需要參考計數嗎?也許你只需要一個函數來釋放你傳遞給調用程序的任何東西?即使你有引用計數,你仍然需要有一些函數被該庫調用。否則計數器將不會減少... – Gerhardh

+0

輸出是由結構構成的哈希表。我需要引用計數器,因此我知道調用程序何時不再需要該散列表,然後我可以釋放爲其分配的所有內存。 這將是很高興知道爲什麼我減去我的問題。我真的不知道這些事情,很高興知道我的問題出了什麼問題,所以我可以找到有關科目的信息,而不必一直提問。 –

回答

0

引用計數允許您的庫的客戶端將您的庫創建的引用對象保存在堆上,並允許您跟蹤有多少引用仍處於活動狀態。當引用計數變爲零時,您可以放心地釋放該對象使用的內存。這是一種實現基本「垃圾收集」的方式。

在C++中,你可以這樣做更容易,通過使用管理通過構造函數和析構函數的引用計數「智能指針」,但它聽起來就像你正在尋找這樣做在C.

您需要在協議上非常明確,您希望庫的用戶在訪問對象時遵循這些協議,以便在創建新引用或不再需要引用時正確通信。解決這個問題會過早釋放仍在被引用的內存,或者導致內存永遠不會被釋放(內存泄漏)。

基本上,您在結構中包含一個引用計數,每次您的庫返回結構時都會增加引用計數。

您還需要提供釋放參考功能:

struct Object { 
    int ref; 
    .... 
} 

Object* getObject (...) { 
    Object *p = .... // find or malloc the object 
    p->ref++; 
    return p; 
} 

void releaseReference (Object* p) { 
    p->ref--; 
    if (p->ref == 0) free(p); 
} 

void grabReference (Object* p) { 
    p->ref++; 
} 

使用grabReference()如果庫的客戶端傳遞到另一個客戶端引用(在上面的例子中,你的庫沒有按最初主叫「T需要調用grabReference()

如果你的代碼是多線程的,那麼你需要確保你遞增或遞減引用

+0

非常感謝!這幫助了我很多,現在我解決了這個問題。該程序現在如假想的那樣工作:) –

+0

謝謝,請你能標記這個問題是回答:) – zakum1

相關問題