弱引用和強引用

2021-09-06 07:34:48 字數 1332 閱讀 1563

如果目標檔案對外部目標檔案符號進行強引用,但在鏈結成可執行檔案時不能被正確的決議(好奇怪的名稱,看看p_51),鏈結器就會報錯,這是對於強引用(strong reference)而言的。

與之相對應還有一種弱引用(weak reference),在處理弱引用時,如果該符號有定義,則鏈結器將對該符號的引用進行決議,如果該符號未被定義,則鏈結器對於該引用不報錯。

鏈結器處理強引用和弱引用的過程幾乎一樣,但是對於未定義的弱引用,鏈結器不認為它是乙個錯誤;一般,對於未定義的弱引用,鏈結器預設其值為0,或者是乙個特殊值,以便於程式**能夠識別。

弱引用和弱符號主要用於庫的鏈結過程。

在gcc中,使用__attribute__((weakref))這個擴充套件關鍵字來宣告對乙個外部函式的引用為弱引用,例如下面這段**:

__attribute__((weakref)) void foo();

int main()

我們可以將它編譯成乙個可執行檔案,gcc並不會報鏈結錯誤,但是在執行這個可執行檔案時,會發生錯誤。因為當main函式試圖呼叫foo函式時,

foo函式的位址為0,於是發生了非法位址訪問的錯誤。乙個改進的例子是:

__attritube__((weakref)) void foo();

int main ()

弱符號可以被使用者定義的強符號所覆蓋,從而使得程式可以使用自定義版本的庫函式;

庫函式可以對某些擴充套件功能模組的引用宣告為弱引用,當我們將擴充套件模組與程式鏈結在一起時,功能模組就可以正常使用;如果我們去掉某些功能模組,

那麼程式也可以正常鏈結,只是缺少了相應的功能,這使得程式的功能更加容易裁剪和組合。

附:在linux程式設計中,如果乙個程式被設計成可以支援單執行緒或多執行緒的模式,就可以通過弱引用的方法來判斷當前的程式是鏈結到了單執行緒的glibc庫還是

多執行緒的glibc庫,從而執行單執行緒版本的程式或多執行緒版本的程式。我們可以在程式中定義乙個pthread_create函式的弱引用,然後程式在執行時動態

判斷是否鏈結到pthread庫從而決定執行多執行緒版本還是單執行緒版本:

1 #include

2 #include

3 4 __attribute__ ((weak)) int pthread_create(pthread_t *, const pthread_attr_t *, void *(*)(void*), void *);

5 6 int main(void)

7 14     else

15    

20     return 0;

21 }

gcc pthread.c -o pt

gcc pthread.c -lpthread -o pt

強引用和弱引用

weak 和 strong 會出現在宣告中 預設情況下,乙個指標都會使用 strong 屬性,表明這是乙個強引用。這意味著,只要引用存在,物件就不能被銷毀。這是一種所期望的行為 當所有 強 引用都去除時,物件才能被收集和釋放。不過,有時我們卻希望禁用這種行為 一些集合類不應該增加其元素的引用,因為這...

C 強引用和弱引用

鏈結器處理強引用和弱引用的過程幾乎是一樣的,只是對於未定義的弱引用,鏈結器不認為它是乙個錯誤,一般預設其為 0 位址為 0 或者是乙個特殊的值,以便程式 能夠識別。attribute weak extern int a printf a d n a 我們可以將它編譯成乙個可執行檔案,gcc 並不會報...

強引用和弱引用( strong和

初學者乾貨 在oc arc模式下開發 id objca nsobject alloc init 預設宣告的乙個物件就為 strong強引用,等價於 id strong objca nsobject alloc init 注 在強引用中,有時會出現迴圈引用的情況,這時就需要弱引用 weak 來幫忙 如...