我一直在寫代碼,並且我正處於一個應該調用我的庫的另一個程序的地步。我應該爲我的圖書館的輸出做一個參考計數器。我已經理解的基本概念是,我需要在我的結構中引用計數器結構,我想傳遞。所以我的問題如下:什麼是參考計數器,它是如何工作的?
在製作參考計數器時我應該記住什麼?
製作參考櫃檯時有什麼不完整的事情?
真的有詳細的例子從哪裏開始呢?
非常感謝您的回答!
我一直在寫代碼,並且我正處於一個應該調用我的庫的另一個程序的地步。我應該爲我的圖書館的輸出做一個參考計數器。我已經理解的基本概念是,我需要在我的結構中引用計數器結構,我想傳遞。所以我的問題如下:什麼是參考計數器,它是如何工作的?
在製作參考計數器時我應該記住什麼?
製作參考櫃檯時有什麼不完整的事情?
真的有詳細的例子從哪裏開始呢?
非常感謝您的回答!
引用計數允許您的庫的客戶端將您的庫創建的引用對象保存在堆上,並允許您跟蹤有多少引用仍處於活動狀態。當引用計數變爲零時,您可以放心地釋放該對象使用的內存。這是一種實現基本「垃圾收集」的方式。
在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()
)
如果你的代碼是多線程的,那麼你需要確保你遞增或遞減引用
非常感謝!這幫助了我很多,現在我解決了這個問題。該程序現在如假想的那樣工作:) –
謝謝,請你能標記這個問題是回答:) – zakum1
不明白你在說什麼時,正確地處理這個.. ..「輸出參考計數器」??? –
您確定需要參考計數嗎?也許你只需要一個函數來釋放你傳遞給調用程序的任何東西?即使你有引用計數,你仍然需要有一些函數被該庫調用。否則計數器將不會減少... – Gerhardh
輸出是由結構構成的哈希表。我需要引用計數器,因此我知道調用程序何時不再需要該散列表,然後我可以釋放爲其分配的所有內存。 這將是很高興知道爲什麼我減去我的問題。我真的不知道這些事情,很高興知道我的問題出了什麼問題,所以我可以找到有關科目的信息,而不必一直提問。 –