用例调试静态运行时?

时间:2014-02-27 12:07:07

标签: visual-c++

Visual C ++具有调试和发布以及动态和静态运行时库。静态调试库的用例是什么? AFAIK你不应该分发调试运行时库,并且在你自己的机器上无论如何都可以使用DLL。

1 个答案:

答案 0 :(得分:1)

为发布版本选择CRT模型后,您想要调试版本的相同模型,以便最大限度地减少调试和发布行为之间的差异。

如果您为Debug版本使用动态CRT,而为版本构建使用静态CRT,则可能会遇到仅在Release版本中触发的错误,而在Debug版本中不会重现。那非常糟糕。

示例:您在DLL中使用malloc并使用DLL在EXE中使用free指针。

调试动态CRT:没问题。
释放静态CRT:发生了奇怪的事情。

如果您使用过Debug static CRT,那么您很快就会看到问题。

编辑:Potential Errors Passing CRT Objects Across DLL Boundaries

  

CRT库的每个副本都有一个独立且不同的状态。如   这样,CRT对象,如文件句柄,环境变量和   locales仅对这些对象所在的CRT副本有效   分配或设置。

当一个DLL及其用户使用不同的副本时   在CRT库中,您无法跨DLL边界传递这些CRT对象   并期望在另一边正确地拾取它们。也,   因为CRT库的每个副本都有自己的堆管理器,   在一个CRT库中分配内存并将指针传递给一个   由CRT库的不同副本释放的DLL边界是a   堆损坏的潜在原因。
如果你设计你的DLL   跨越边界传递CRT对象或分配内存和期望   它要在DLL外部释放,你限制DLL用户使用   与DLL相同的CRT库副本。 DLL及其用户使用   CRT库的相同副本,只有两者都链接在一起   CRT DLL的版本。 [...]