2017-02-01 24 views
2

今天我在面試中被問到這個問題。不幸的是,我不確定我是否正確地在這裏複製了它。我只記得,我沒有很好地理解它。這個問題可能是將靜態和動態庫鏈接到同一個可執行文件的原因有哪些問題?

「加載靜態和動態編譯的dll 會導致什麼問題?」

我不知道答案,但面試官告訴我,至少有兩個主要問題

  1. 運行時庫:可以有一些不兼容的分配和去分配的記憶。

  2. 不幸的是,在這裏我們被打斷了,我們沒有回到這個問題。

請問,你能幫我理解這個問題可能是什麼,以及答案是什麼?

我也很不理解第一點。我認爲在一個程序中只能有一個malloc,我錯了嗎?

回答

4

假設A.dll與標準庫版本1.0靜態鏈接。它有一個功能,看起來像這樣:

char * f() { 
    return malloc(100); // uses malloc 1.0 
    } 

現在讓我們說有另一個庫B.DLL與標準庫1.1版動態與A.DLL和靜態鏈接。它有一個功能,看起來像這樣:

void g() { 
     char * p = f(); // returns the result of malloc 1.0 
     free(p); // uses free 1.1 
    } 

你那麼很可能(我說「可能」,是因爲這一切都不是標準化的)具有已動態與標準庫1.0分配的指針,但與版本釋放1.1。這通常會導致嚴重且難以診斷的問題。

+0

謝謝! 「標準庫」是指運行時庫,還是暗示它包含在標準庫中? –

+1

C和C++標準都沒有提及任何有關運行時庫的信息。 malloc和free是兩種語言的標準庫的一部分。 –

1

由於靜態編譯的dll是在運行時編譯的,如果您需要更改任何內容(比如函數),您將不得不重新編譯該.exe。靜態編譯的DLL也比動態鏈接的DLL大。動態鏈接DLL在運行時被鏈接,所以每個程序都可以訪問它們,因爲所有的函數在內存中都有特殊的位置,而沒有多個副本(就像靜態編譯時那樣)。希望這可以幫助。

+1

沒有靜態或動態編譯的東西。不,您不必重新編譯.exe - 您可能需要重新鏈接它。 –

相關問題