2010-08-02 81 views
0

我發現,我的應用程序崩潰,在這裏空引用例外sweep.c在GLU源代碼:爲什麼GLU會在這個位置崩潰?

static void ConnectLeftVertex(GLUtesselator *tess, GLUvertex *vEvent) 
/* 
* Purpose: connect a "left" vertex (one where both edges go right) 
* to the processed portion of the mesh. Let R be the active region 
* containing vEvent, and let U and L be the upper and lower edge 
* chains of R. There are two possibilities: 
* 
* - the normal case: split R into two regions, by connecting vEvent to 
* the rightmost vertex of U or L lying to the left of the sweep line 
* 
* - the degenerate case: if vEvent is close enough to U or L, we 
* merge vEvent into that edge chain. The subcases are: 
* - merging with the rightmost vertex of U or L 
* - merging with the active edge of U or L 
* - merging with an already-processed portion of U or L 
*/ 
{ 
    ActiveRegion *regUp, *regLo, *reg; 
    GLUhalfEdge *eUp, *eLo, *eNew; 
    ActiveRegion tmp; 

    /* assert(vEvent->anEdge->Onext->Onext == vEvent->anEdge); */ 

    /* Get a pointer to the active region containing vEvent */ 
    tmp.eUp = vEvent->anEdge->Sym; 
    /* __GL_DICTLISTKEY */ /* __gl_dictListSearch */ 
    regUp = (ActiveRegion *)dictKey(dictSearch(tess->dict, &tmp)); 
    regLo = RegionBelow(regUp); 
    eUp = regUp->eUp; 
    eLo = regLo->eUp; //CRASHES RIGHT HERE SINCE RegLo is = 0x000000 FOR SOME REASON 

    /* Try merging with U or L first */ 
    if(EdgeSign(eUp->Dst, vEvent, eUp->Org) == 0) { 
    ConnectLeftDegenerate(tess, regUp, vEvent); 
    return; 
    } 

    /* Connect vEvent to rightmost processed vertex of either chain. 
    * e->Dst is the vertex that we will connect to vEvent. 
    */ 
    reg = VertLeq(eLo->Dst, eUp->Dst) ? regUp : regLo; 

    if(regUp->inside || reg->fixUpperEdge) { 
    if(reg == regUp) { 
     eNew = __gl_meshConnect(vEvent->anEdge->Sym, eUp->Lnext); 
     if (eNew == NULL) longjmp(tess->env,1); 
    } else { 
     GLUhalfEdge *tempHalfEdge= __gl_meshConnect(eLo->Dnext, vEvent->anEdge); 
     if (tempHalfEdge == NULL) longjmp(tess->env,1); 

     eNew = tempHalfEdge->Sym; 
    } 
    if(reg->fixUpperEdge) { 
     if (!FixUpperEdge(reg, eNew)) longjmp(tess->env,1); 
    } else { 
     ComputeWinding(tess, AddRegionBelow(tess, regUp, eNew)); 
    } 
    SweepEvent(tess, vEvent); 
    } else { 
    /* The new vertex is in a region which does not belong to the polygon. 
    * We don''t need to connect this vertex to the rest of the mesh. 
    */ 
    AddRightEdges(tess, regUp, vEvent->anEdge, vEvent->anEdge, NULL, TRUE); 
    } 
} 

這好像eRegLo有時是一個NULL指針導致我的應用程序崩潰。我如何修改源代碼以防止崩潰我的應用程序?

感謝

+0

難道這是'RegionBelow()'返回錯誤空嗎? – Bobby 2010-08-02 19:48:52

回答

1

你將不得不考慮的來源RegionBelow,看看是否以及何時可以返回NULL指針。在您致電RegionBelow和您的取消引用regLo之間,執行regLo == NULL檢查。你可以用assert或拋出一個異常(用C++)來做到這一點。最有可能的是,如果RegionBelow錯誤返回NULL,則可以使用其他一些方法來確定錯誤是什麼以及如何處理它。您將必須查閱RegionBelow的源代碼或文檔以找到該信息。