问题:在第265次运行到t_db->Open("EntityTable");时出现First-chance exception in debug.exe (NTDLL.DLL): 0xC00000FD: Stack Overflow. 什么问题? 以下是源代码:
CDaoDatabase g_db;
CreateDataTables(char *outfilename)
{  
   g_db.Create(mdbFilename);
   //...
}
BOOL Judge_Fence()
{
   //...
CDaoTableDef  *t_db = new CDaoTableDef(&g_db);
t_db->Open("EntityTable"); CDaoRecordset *p_Set = new CDaoRecordset(&g_db);
p_Set->Open(t_db, dbOpenDynaset, 0);
if ( p_Set->GetRecordCount()<1 ) 
{
   p_Set->Close();     delete p_Set;
   t_db->Close();      delete t_db;
   return FALSE;
} p_Set->MoveFirst();
while (!p_Set->IsEOF())
{
 //...
   p_Set->MoveNext();
} p_Set->Close();
t_db->Close(); delete p_Set;
delete t_db; return TRUE;
}

解决方案 »

  1.   

    栈不够了
    while (!p_Set->IsEOF())
    {
     //...
       p_Set->MoveNext();

    循环里做了什么?
      

  2.   

    第1~265次递归运行时没死,第266次运行就死了,可以重现.我是设置了900次不满足条件才无条件退出.
    BOOL Judge_Fence()是一个满足递归的条件判断.
    怎么解决呢?
      

  3.   

    Bool CALCUTE()
    {
       BOOL RET = Judge_Fence();
       if (!ret)
       {
         //..
         CALCUTE();  
       }   //...
    }
      

  4.   

    Judge_Fence()函数里数据库部分语法有无问题?
      

  5.   

    BOOL Judge_Fence() 

       //... 
       BOOL ret = TRUE;
       CDaoTableDef  *t_db = new CDaoTableDef(&g_db); 
       t_db->Open("EntityTable");    CDaoRecordset *p_Set = new CDaoRecordset(&g_db); 
       p_Set->Open(t_db, dbOpenDynaset, 0); 
       if ( p_Set->GetRecordCount() <1 )  
       { 
         p_Set->Close();     delete p_Set; 
         t_db->Close();      delete t_db; 
         return FALSE; 
       }    p_Set->MoveFirst(); 
       while (!p_Set->IsEOF()) 
       { 
        //... 
          p_Set->MoveNext(); 
         if (...)
            ret = FALSE;
        }    p_Set->Close(); 
       t_db->Close();   delete p_Set; 
      delete t_db;   return ret; 

      

  6.   

    为什么要用递归呢?BOOL Calculate()
    {
        do
        {
            // 处理工作:
        }while( !Judge_Fence() );   // 收尾工作:
    }
      

  7.   

    递归的极限次数 = 栈的大小/函数局部变量大小栈的缺省大小为1M256次: 函数使用的局部变量大小 1M/256 = 4K 函数局部变量 4K 不算少了, 函数中尽量不要使用数组, 类, 你可以用指针+new来代替, 这样可以极大提高极限次数
      

  8.   

    错了:(。BOOL Calculate()
    {
        while( !Judge_Fence() )
        {
            // 处理工作:
        }   // 收尾工作:
    }
      

  9.   

    Judge_Fence()函数里数据库有无问题?如内存释放等.请验证!!
      

  10.   

    Judge_Fence()函数里数据库无内存问题,只是一些判断