0

我正在构建一个应用程序,其输出是最终被另一个客户端应用程序使用的库。我最近发现我正在使用/MDd代码生成(调试 CRT 库)在调试模式下构建我的应用程序,并且即使/MD在调试模式下使用,客户端应用程序也是针对发布 CRT 构建的。因此,这可能会导致一些内存堆损坏错误。为了确认,我在发布模式下测试了所有内容,它似乎工作正常。

为了解决这个问题,我也尝试了release with debug info构建(/MD)并将客户端应用程序的调试构建与此relwithdebinfo构建相关联,但现在在测试我的示例时,我在客户端应用程序中看到了一些奇怪的行为。准确地说,当我分配一个字符串时,说使用:

std::string client_str = some_namespace_in_my_library::class_name::string_name,

我发现 client_str 没有分配,而是保持为空。当一切都在调试中构建时(当存在混合和匹配时),这工作正常。任何想法为什么会发生这种情况?上面引用的命名空间中的字符串是类的静态公共成员,class_name. 所有这些都在 MS VC++ 2005 上。非常感谢任何建议/帮助。谢谢!

4

1 回答 1

1

我的猜测是,由于检查过的迭代器,您违反了单一定义规则。请参阅:http: //msdn.microsoft.com/en-us/library/aa985896 (v=vs.80).aspx

问题是,就像上面 Bo 已经写的那样,在 STL 中使用的结构和类在调试和发布版本中的大小不同,并且无论是否使用检查迭代器都会产生更多问题。

另一个原因可能是,检查迭代器的默认值随着发布版本的 Visual Studio 版本而改变。虽然默认情况下它在 vs2005 和 vs2008 中是打开的,但在 2010+ 中它是关闭的(检查所有依赖库以及它们是如何构建的!)

这里最重要的规则是:确保每个编译单元都使用完全相同的设置,无论是 for_SECURE_SCL还是_HAS_ITERATOR_DEBUGGING.

我还记得一件事,但现在找不到链接:即使使用和不使用检查迭代器的调试构建是兼容的,vs2005 也存在错误,未正确实现,我认为在以后的版本中已修复。

于 2012-09-13T03:58:52.993 回答