gpt4 book ai didi

c++ - 为什么当使用 _ITERATOR_DEBUG_LEVEL=0 销毁 vector 时,Visual C++ 2010 仍调用 Orphan_all?

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:02 25 4
gpt4 key购买 nike

这里是 Visual C++ 新手。 (我在很久以前就熟悉了 Visual C++ 6,从那时起就偶尔使用过 IDE,但仍然感觉不舒服。给我一个好的旧命令行并离开我的草坪,这就是我的态度。)

我正在帮助开发一个使用 Visual C++ 2010 构建的应用程序(它是一个包含 20 个子项目的解决方案文件),并注意到一些奇怪的事情:即使 _ITERATOR_DEBUG_LEVEL 和 _SECURE_SCL 在项目属性中都定义为零,添加/FAs其中一个 .cpp 文件仍然显示对已检查的迭代器内容的调用,例如

   call    DWORD PTR __imp_?_Orphan_all@_Container_base0@std@@QAEXXZ

我已经验证(使用 printf)两个定义都为零。此外,这些电话似乎非常脆弱;如果我从相关函数中删除看似微不足道的代码,对 Orphan_all 的调用就会消失。

那么:当一个 vector 被 _ITERATOR_DEBUG_LEVEL=0 销毁时,为什么 Visual C++ 2010 仍然调用 Orphan_all ?(此外,我还听说windows sdk v7.1和几个游戏中的cl.exe本身似乎都从msvcp100.dll导入_Orphan_all@_Container_base0@std@@QAEXXZ,这对于已发布的产品来说似乎很奇怪。msvcp100应该做什么.dll 的 _Orphan_all@_Container_base0@std@@QAEXXZ 做 -- 它是空操作,还是它确实做事,就像 msvcp100d.dll 中的那样?)

最佳答案

编辑。

所以,由于 _Vector_val 继承自 _Container_base

#if _ITERATOR_DEBUG_LEVEL == 0
typedef _Container_base0 _Container_base;
typedef _Iterator_base0 _Iterator_base;

#else /* _ITERATOR_DEBUG_LEVEL == 0 */
typedef _Container_base12 _Container_base;
typedef _Iterator_base12 _Iterator_base;
#endif /* _ITERATOR_DEBUG_LEVEL == 0 */

_Container_base0 在哪里

        // CLASSES _Container_base*, _Iterator_base*
struct _CRTIMP2_PURE _Container_base0
{ // base of all containers
void _Orphan_all()
{ // orphan all iterators
}

void _Swap_all(_Container_base0&)
{ // swap all iterators
}
};

当 _ITERATOR_DEBUG_LEVEL 为 0 时,您使用空的 _Orphan_all。

关于c++ - 为什么当使用 _ITERATOR_DEBUG_LEVEL=0 销毁 vector 时,Visual C++ 2010 仍调用 Orphan_all?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11572845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com