在Visual C ++ malloc警告

时间:2016-03-15 18:28:29

标签: c++ winapi openssl

OpenSSL 1.0.2g软件包的INSTALL.W32文档包含以下警告文本:

  

关于编译链接到OpenSSL库的应用程序的最后评论。    如果您不使用多线程DLL运行时库(/ MD选项)    程序几乎肯定会崩溃因为malloc感到困惑 - 这个    OpenSSL DLL静态链接到一个版本,应用程序必须    不要使用其他的。

我不完全理解这个或它的影响。他们是说不支持静态链接libeay32mt.lib吗?

我们的应用程序遇到随机崩溃,堆栈跟踪有时会指向openssl函数中的免费调用,这是否是此警告所指的预期症状?

1 个答案:

答案 0 :(得分:0)

C和C ++内存管理在CRT(C运行时库)中实现。映射到进程的CRT的每个物理副本(静态编译成模块或引用的DLL)使用不同的堆。内存分配和解除分配必须在同一个堆上执行,即相同的物理CRT副本(有关详细信息,请参阅Potential Errors Passing CRT Objects Across DLL Boundaries)。

在您的特定情况下,您需要确保执行以下操作:

  • 将您的应用程序与OpenSSL DLL动态链接。
  • 将您的应用程序与CRT动态链接。
  • 验证您的应用程序和OpenSSL DLL是否链接到相同版本的CRT(版本和配置)。

虽然可以静态链接OpenSSL,但是如果可以确保最终二进制文件包含单个CRT实现,并且不(直接或间接)动态链接CRT。这很难维护,一旦你链接到一个不提供静态库的库就会中断。