我今天在面试时被问到这个问题。不幸的是,我不确定我是否正确地在这里复制了它。我记得,我不太了解它。问题可能是
“可以加载静态和动态编译的dll有什么问题 引起?“
我不知道答案,但面试官告诉我至少有两个主要问题:
运行时库:可能存在一些不兼容的内存分配和解除分配。
不幸的是,我们被打断了,我们没有回到这个问题。
拜托,您能帮我理解这个问题可能是什么,以及答案是什么?
我也不太了解第一点。我以为程序中只能有一个malloc
,我错了吗?
答案 0 :(得分:4)
让我们说A.dll与标准库版本1.0静态链接。它有一个看起来像这样的功能:
char * f() {
return malloc( 100 ); // uses malloc 1.0
}
现在假设有另一个库B.dll与A.dll动态链接,静态链接到标准库1.1版。它的功能如下:
void g() {
char * p = f(); // returns the result of malloc 1.0
free( p ); // uses free 1.1
}
然后你可能(我说"可能"因为这些都不是标准化的)有一个指针,它是用标准库1.0动态分配的,但是它已经用版本1.1释放了。这通常会导致严重且难以诊断的问题。
答案 1 :(得分:1)
因为静态编译的dll是在运行时之前编译的,如果你需要改变任何东西(比如函数),你就必须重新编译.exe。静态编译的dll也比动态链接的dll大。动态链接的dll在运行时链接,因此每个程序都可以访问它们,因为所有函数在内存中都有特殊的位置,而没有它们的多个副本(就像它们被静态编译时一样)。希望这会有所帮助。