は新しく割り当てられたオブジェクトを返すためUnion
、古いオブジェクトが確実にクリーンアップされるようにする必要があります。
OGRPolygon* pOgrMerged = new OGRPolygon();
for(int i=0; i<triangles.size(); i++){
OGRLinearRing ogrring;
ogrring.addPoint( triangles[i].a.x, triangles[i].a.y );
ogrring.addPoint( triangles[i].b.x, triangles[i].b.y );
ogrring.addPoint( triangles[i].c.x, triangles[i].c.y );
ogrring.closeRings();
OGRPolygon ogrtriangle;
ogrtriangle.addRing( &ogrring );
OGRPolygon* pTemp = static_cast<OGRPolygon*>(pOgrMerged->Union(&ogrtriangle));
if (pTemp != NULL) // If you are using C++11 you could check for nullptr)
{
delete pOgrMerged;
pOgrMerged = pTemp;
}
else
{
// Handle the case where the merge resulted in an error. It may be because
// the polygons didn't overlap or something like that, check the docs for OGR
}
}
// Do what you need to do with pOgrMerged and then return it or delete it (do not
// delete it if you are going to return it
delete pOgrMerged;
このコードが生のポインターを使用していることはわかっています。C++ 11 を使用しているかどうか、またはブーストまたは他のライブラリを使用しているかどうかはわかりませんが、auto_ptr が必要な場合は、生のポインターを unique_ptr/shared_ptr のようなものでラップすることをお勧めします。このようにして、オブジェクトをリークしません。
unique_ptrを使用した同じコード:
std::uniqe_ptr<OGRPolygon> pOgrMerged(new OGRPolygon());
for(int i=0; i<triangles.size(); i++){
OGRLinearRing ogrring;
ogrring.addPoint( triangles[i].a.x, triangles[i].a.y );
ogrring.addPoint( triangles[i].b.x, triangles[i].b.y );
ogrring.addPoint( triangles[i].c.x, triangles[i].c.y );
ogrring.closeRings();
OGRPolygon ogrtriangle;
ogrtriangle.addRing( &ogrring );
OGRPolygon* pTemp = static_cast<OGRPolygon*>(pOgrMerged->Union(&ogrtriangle));
if (pTemp != NULL) // If you are using C++11 you could check for nullptr)
{
pOgrMerged.reset(pTemp);
}
else
{
// Handle the case where the merge resulted in an error. It may be because
// the polygons didn't overlap or something like that, check the docs for OGR
}
}