記一次geos內存申請釋放的崩潰查錯

原先的錯誤代碼:

const GeometryFactory *pGeomFactory = GeometryFactory::getDefaultInstance();
const CoordinateSequenceFactory *pCoordFactory = CoordinateArraySequenceFactory::instance();

// 構造
typedef map<int,Geometry*> Polygons;
Polygons plygns;
for (int iVal=0; iVal<nEntities; ++iVal)
{
    SHPObject *pObj = SHPReadObject(hShp, iVal);

    LinearRing *pRingExt = NULL;
    <span style="color:#ff0000;">vector<Geometry*> vecRingInt;</span>
    for (int iPart=0; iPart<pObj->nParts; ++iPart)
    {
        int iBeg = pObj->panPartStart[iPart];
        int iEnd = iPart==pObj->nParts-1 ? pObj->nVertices:pObj->panPartStart[iPart+1];
        int iSize = iEnd-iBeg;

        CoordinateSequence* pCs = pCoordFactory->create(iSize,2);
        for (int iCoord=0; iCoord<iSize; ++iCoord)
            pCs->setAt(Coordinate(pObj->padfX[iBeg+iCoord], pObj->padfY[iBeg+iCoord]), iCoord);
        LinearRing *pRing = pGeomFactory->createLinearRing(pCs);

        if (iPart == 0)
            pRingExt = pRing;
        else
            vecRingInt.push_back(pRing);
    }
    Polygon *pPolygon = pGeomFactory->createPolygon(pRingExt,&vecRingInt);
    plygns.insert(make_pair(iVal,pPolygon));

    SHPDestroyObject(pObj);
}

// 釋放
for (Polygons::iterator iter=plygns.begin(); iter!=plygns.end(); ++iter)
{
    iter->second->getFactory()->destroyGeometry(iter->second);
    iter->second = NULL;
}
plygns.clear();


修改後的代碼

const GeometryFactory *pGeomFactory = GeometryFactory::getDefaultInstance();
const CoordinateSequenceFactory *pCoordFactory = CoordinateArraySequenceFactory::instance();

// 構造
typedef map<int,Geometry*> Polygons;
Polygons plygns;
for (int iVal=0; iVal<nEntities; ++iVal)
{
    SHPObject *pObj = SHPReadObject(hShp, iVal);

    LinearRing *pRingExt = NULL;
    <span style="color:#ff0000;">vector<Geometry*> *pRingInt = new vector<Geometry*>;</span>
    for (int iPart=0; iPart<pObj->nParts; ++iPart)
    {
        int iBeg = pObj->panPartStart[iPart];
        int iEnd = iPart==pObj->nParts-1 ? pObj->nVertices:pObj->panPartStart[iPart+1];
        int iSize = iEnd-iBeg;

        CoordinateSequence* pCs = pCoordFactory->create(iSize,2);
        for (int iCoord=0; iCoord<iSize; ++iCoord)
            pCs->setAt(Coordinate(pObj->padfX[iBeg+iCoord], pObj->padfY[iBeg+iCoord]), iCoord);
        LinearRing *pRing = pGeomFactory->createLinearRing(pCs);

        if (iPart == 0)
            pRingExt = pRing;
        else
            pRingInt->push_back(pRing);
    }
    Polygon *pPolygon = pGeomFactory->createPolygon(pRingExt,pRingInt);
    plygns.insert(make_pair(iVal,pPolygon));

    SHPDestroyObject(pObj);
}

// 釋放
for (Polygons::iterator iter=plygns.begin(); iter!=plygns.end(); ++iter)
{
    iter->second->getFactory()->destroyGeometry(iter->second);
    iter->second = NULL;
}
plygns.clear();


問題在於,使用createPolygon函數非const的指針參數重載版本爲所有權轉移,內環的vector記得也是指針,而我構造Polygon內環的vector出了作用域就灰飛煙滅了,於是就掛了


PS:這裏的vector是在我的程序申請的內存,卻在geos模塊釋放,表示有點強迫,有空再找找geos有沒有由它申請vector的方法,實在不行就先createEmptyPolygon再addRing吧,或者調用拷貝構造的createPolygon犧牲點效率。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章