VC 的DEBUG模式下 STL 默认启用编译宏_ITERATOR_DEBUG_LEVEL=1,容器析构的时候有BUG,接近死循环

偶然发现的一个问题,VS版本为2013

static std::list<int> s_list;

void TestIteratorDestructTiming()
{
    s_list.push_back(0);
    DWORD64 dwStartTick = GetTickCount64();

    struct tagStruct
    {
        std::list<int>::const_iterator citr;
        tagStruct()
        {
            citr = s_list.begin();
        }
    };
    std::vector<tagStruct> container;
    container.resize(10000000);
 
    std::cout << "Resize Timing Ticks:" << GetTickCount64() - dwStartTick << std::endl;

    dwStartTick = GetTickCount64();
    container.clear();
    std::cout << "Clear Timing Ticks:" << GetTickCount64() - dwStartTick << std::endl;

}


RELEASE 模式下,运行结果

Resize Timing Ticks:16

Clear Timing Ticks:0


DEBUG 模式下,运行结果

Resize Timing Ticks:6968

然后一直卡在 container.clear(); 

VC 的DEBUG模式下 STL 启用_ITERATOR_DEBUG_LEVEL=1,这个有bug 析构的时候会做无用的循环检测 次数貌似是随机未初始化的,接近死循环
可在工程设置里定义 _ITERATOR_DEBUG_LEVEL=0 屏蔽检测

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值