直接复制代码:
polygon Sub(polygon A,polygon B)
{
if (!Isintersects(A,B))//如果不相交直接返回A
{
return A;
}
OGRLinearRing pARing; //A
for (long i=0;i<(long)A.pts.size();i++)
{
pARing.addPoint(A.pts[i].x,A.pts[i].y);
}
OGRPolygon pApolygon;
pApolygon.addRing(&pARing);
OGRLinearRing pBRing; //B
for (long i=0;i<(long)B.pts.size();i++)
{
pBRing.addPoint(B.pts[i].x,B.pts[i].y);
}
OGRPolygon pBpolygon;
pBpolygon.addRing(&pBRing);
OGRGeometry pSumres = pApolygon.Difference(pBpolygon.clone());
bool ppp = pApolygon.Within(pBpolygon.clone());
bool pppp = pApolygon.Contains(pBpolygon.clone());
OGRPolygon pPoly = (OGRPolygon*)pSumres;
double p = pPoly->get_Area();
if (ppp || p == 0)
{
polygon midpoy;
return midpoy;
}
else
{
OGRLinearRing *pring = pPoly->getExteriorRing();
polygon midpoy;
midpoy.pts.resize((long)pring->getNumPoints());
for (long i=0;igetNumPoints();i++)
{
midpoy.pts[i].x = pring->getX(i);
midpoy.pts[i].y = pring->getY(i);
}
return midpoy;
}
}
这个代码想要实现的功能是多边形求差的功能,利用了GDAL库函数,就是把自己的形式数据改写了之后利用GDAL库函数处理,之后再转换成我的数据存储形式进行传出。
这段代码,在运行多次以后,在任务管理器中就会看到这个程序的内存在增大,可是我在这个程序里面也没有在堆栈上开辟空间啊,之前用的指针开辟堆栈空间,后来在释放空间时老是会出现异常,所以就全都改成这样。我前面说的多次运行,是采用了循环,代码:
for (long i=0;i<100000;i++)
{
polygon ply2 = Sub(A,B);
}
对这个GDAL库真心用的心累,求各位神帮助!!!累到爆炸
C++编程,多次运行这段代码,出现内存泄漏,也没有用堆栈,不知道哪里错了!求各位大神帮助!!
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答
- world680 2017-09-09 02:12关注
haha,自己找到了,在这里分享一下吧!!那个在这里面用了克隆,pBpolygon.clone(),这个函数传出的是一个地址,应该是在堆栈中创建了和pBpolygon同样大小的内存空间,把这个地址存起来,在程序末尾把它delete,内存泄漏消失了,问题得到解决。。。。。。
解决 无用评论 打赏 举报