我是靠谱客的博主 寒冷服饰,最近开发中收集的这篇文章主要介绍vc2010多线程使用std标准模板库容器DEBUG版迭代器BUG,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在vc2010多线程环境下使用std标准模板库容器 list 时, 如果是DEBUG版本, 迭代器存在BUG


在<list>文件中,以下代码块会出现非法访问错,实际上是在子线程中调用list的begin()方法返回迭代器时更改了  _Pnext 所指内存块的值。

#if _ITERATOR_DEBUG_LEVEL == 2
    void _Orphan_ptr(_Myt& _Cont, _Nodeptr _Ptr) const
        {    // orphan iterators with specified node pointers
        _Lockit _Lock(_LOCK_DEBUG);
        const_iterator **_Pnext = (const_iterator **)_Cont._Getpfirst();
        if (_Pnext != 0)
            while (*_Pnext != 0)
                if ((*_Pnext)->_Ptr == this->_Myhead
                    || _Ptr != 0 && (*_Pnext)->_Ptr != _Ptr)
                    _Pnext = (const_iterator **)(*_Pnext)->_Getpnext();
                else
                    {    // orphan the iterator
                    (*_Pnext)->_Clrcont();
                    *_Pnext = *(const_iterator **)(*_Pnext)->_Getpnext();
                    }
        }
 #endif /* _ITERATOR_DEBUG_LEVEL == 2 */


解决办法,跟踪_ITERATOR_DEBUG_LEVEL 宏定义,打开yvals.h文件,将157行的

#define _HAS_ITERATOR_DEBUGGING 1 改为 #define _HAS_ITERATOR_DEBUGGING 0

最后

以上就是寒冷服饰为你收集整理的vc2010多线程使用std标准模板库容器DEBUG版迭代器BUG的全部内容,希望文章能够帮你解决vc2010多线程使用std标准模板库容器DEBUG版迭代器BUG所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部