C++ 调试MS VC+中的堆损坏错误+;2005

C++ 调试MS VC+中的堆损坏错误+;2005,c++,windows,visual-studio-2005,msvcrt,crt,C++,Windows,Visual Studio 2005,Msvcrt,Crt,我正在构建一个应用程序,其输出是最终被另一个客户端应用程序使用的库。我最近发现,我在调试模式下使用/MDd生成代码(调试CRT库),并且客户机应用程序是在调试模式下使用/MD根据发布CRT构建的。因此,这可能会导致一些内存堆损坏错误。为了证实这一点,我在发布模式下测试了所有内容,在那里它似乎工作正常 为了解决这个问题,我也尝试使用debug info构建(/MD)进行发布,并将客户机应用程序的调试构建与此relwithdebinfo构建相链接,但现在在测试我的示例时,我在客户机应用程序中看到了一

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

为了解决这个问题,我也尝试使用debug info构建(
/MD
)进行
发布,并将客户机应用程序的调试构建与此
relwithdebinfo
构建相链接,但现在在测试我的示例时,我在客户机应用程序中看到了一些奇怪的行为。准确地说,当我指定字符串时,请使用:

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

我发现client_str没有分配,而是保持为空。当一切都在调试中构建时(当存在混合匹配时),这一切都可以正常工作。知道为什么会这样吗?上面引用的命名空间中的字符串是类的静态公共成员,
class\u name
。所有这些都是在MS VC++2005上实现的。非常感谢您的任何建议/帮助。谢谢

我猜您违反了一个定义规则,因为检查了迭代器。见:

问题是,像上面已经写过的Bo一样,STL中使用的结构和类在调试和发布版本中的大小不同,并且在使用和不使用检查迭代器的情况下问题更大

另一个原因可能是,已检查迭代器的默认值随发布版本的visual studio版本而更改。vs2005和vs2008的默认设置是打开的,而2010+的默认设置是关闭的(请检查所有依赖项库及其构建方式!)

这里最重要的规则是:确保每个编译单元使用完全相同的设置,包括
\u SECURE\u SCL
\u HAS\u ITERATOR\u debug


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

Thank@Persson:不,它不是重复的(我也发布了该错误). 阅读问题/帖子。我在尝试一些不同的东西。是的。。但不是复制品。我可以将此作为编辑(或最近的操作)集成到原始问题中。当混合调试和发布代码时,任何不好的事情都可能发生。我认为这是你在另一个问题中遇到的同样问题的另一个例子。建议就是不要尝试这个。很抱歉你能澄清一下吗?假设您有一个应用程序,并且您正在链接一个不需要调试(通常无法调试)的第三方库。为什么要链接这些库的调试版本?同样,许多应用程序根据发布的CRT构建调试版本。既然如此,你到底有什么建议?我不确定VS2005,但我知道VS2010在调试模式下向容器和迭代器(包括
std::string
)添加了额外的调试帮助器字段。这意味着对象的调试版本和发布版本具有不同的大小,而像赋值这样的事情肯定不会起作用。我怀疑你在这里遇到了类似的事情。