按F5调试release版本程序,还没进行APP类的构造函数,就出现未处理异常,跟踪进去,发现在下面一个函数出错:inline void* CThreadSlotData::GetThreadValue(int nSlot)
{
EnterCriticalSection(&m_sect);
ASSERT(nSlot != 0 && nSlot < m_nMax);
ASSERT(m_pSlotData != NULL);
ASSERT(m_pSlotData[nSlot].dwFlags & SLOT_USED);
ASSERT(m_tlsIndex != (DWORD)-1);
// 在下面出错,nSlot 等于0
if( nSlot <= 0 || nSlot >= m_nMax ) // check for retail builds. 
{
LeaveCriticalSection(&m_sect);
return NULL;
} CThreadData* pData = (CThreadData*)TlsGetValue(m_tlsIndex);
if (pData == NULL || nSlot >= pData->nCount)
{
LeaveCriticalSection(&m_sect);
return NULL;
}
void* pRetVal = pData->pData[nSlot];
LeaveCriticalSection(&m_sect);
return pRetVal;
}
    上网查了下,发现GetThreadValue用来获取调用线程的第slot个线程局部变量的值。请问为什么会有这个错误呢?如何解决这个错误呢?编译环境:VS C++2005 ,Win XP sp2.

解决方案 »

  1.   

    你在CThreadSlotData的构造函数上设置断点单步调试看看。
      

  2.   

    通常调试在release 下不太好用,
    建议先在debug下仔细调试下,在什么地方出的错
      

  3.   

    你的程序是不是主程序+动态库?
    如果是, 保持这两个工程用同一个运行时库, 具体在project > settings > c/c++ > code generation , 选择单线程, 多线程库...
      

  4.   

    你的程序是不是主程序+动态库? 
    如果是, 保持这两个工程用同一个运行时库, 具体在project > settings > c/c++ > code generation , 选择单线程, 多线程库...Up
    Up
      

  5.   

        ASSERT(nSlot != 0 && nSlot < m_nMax);
    // 在下面出错,nSlot 等于0这个函数里面有断言,nSlot应该是不能等于0的
    你传个0的参数进去,肯定会有异常的
      

  6.   

    参数已经出错了,不能是0,第一个断言语句就表明了。不过很可能不是这个问题,因为Release下调试看到的变量值极可能都是不可靠的
      

  7.   


        debug调试下没有问题,可以正常启动。