【发布时间】:2012-06-18 20:34:12
【问题描述】:
我正在构建一个应用程序,其输出是最终被另一个客户端应用程序使用的库。我最近发现我正在使用/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 上。非常感谢任何建议/帮助。谢谢!
【问题讨论】:
-
谢谢@Persson:不,它不是重复的(我也发布了那个)。阅读问题/帖子。我在这里尝试不同的东西。相关,是的..但不是重复的。我可以将其作为编辑(或最近的操作)整合到原始问题中。
-
混合调试和发布代码时,任何事情都可能发生。我认为这是您在另一个问题中遇到的相同问题的另一个实例。建议就是不要尝试这个。对不起!
-
你能澄清一下吗?假设您有一个应用程序,并且您正在链接一个您不需要调试(并且通常不能)的第三方库。为什么要链接这些库的调试版本?同样,许多应用程序针对发布 CRT 构建其调试版本。因此,鉴于此,您究竟在建议什么?
-
我不确定 VS2005,但我知道 VS2010 在调试模式下向容器和迭代器(包括
std::string)添加了额外的调试帮助器字段。这意味着对象的调试和发布版本具有不同的大小,并且像赋值之类的东西肯定行不通。我怀疑你在这里遇到了类似的事情。
标签: c++ windows visual-studio-2005 msvcrt crt