_ITERATOR调试级别混淆

_ITERATOR DEBUG LEVEL confusion?

本文关键字:ITERATOR 调试      更新时间:2023-10-16

我已经决定从现在开始在RELEASE上工作,不再调试了。

我已经将相同的目录/路径/Debug的额外blabla复制到发布中,以摆脱"未定义的…问题"

但是我仍然有以下错误/警告:

Error   3   error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '1' in ex4.obj  C:...exqtmaind.lib(qtmain_win.obj)
Warning 4   warning LNK4098: defaultlib 'msvcrtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library   C:...exMSVCRT.lib(cinitexe.obj)
Error   5   error LNK1319: 1 mismatches detected    C:...Win32Release\ex.exe    1

你能帮我整理一下吗?

当您使用MSVC在调试和发布版本之间进行更改时,您需要更改链接到的C运行时的版本。即改变/MDd -> /MD/MTd -> /MT

在项目中混合_ITERATOR_DEBUG_LEVEL肯定会导致灾难:您可能会出现随机崩溃,内存损坏等。不要去那里。在某些情况下,链接器会为您提供链接,但不幸的是,缺乏警告可能仍然会给您带来问题。

唯一真正的解决方法是使用统一的选项进行编译。(当然包括_ITERATOR_DEBUG_LEVEL,但其他设置也可能导致问题。)

问题的根源在于您包含的头文件有#if部分,因此使用不同的设置编译不同的代码。这被称为对ODR的违反,这是唯一定义规则。这将以未定义的行为惩罚您,甚至不需要诊断。

例如,一部分代码可能认为vector的大小为16字节,而其他部分为24字节。一个迭代器的指针在偏移量0处,另一个在偏移量8处。

在mix是绝对必须的地方,你需要小心地防火墙程序的各个部分,这样它们就不会直接共享来自标准库的对象,只由一个轻接口绑定,每个人都只处理它的私有数据。