2017-02-01 23 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 - 您可能需要重新链接它。 –

相关问题