2 world680 world680 于 2017.09.09 07:42 提问

C++编程,多次运行这段代码,出现内存泄漏,也没有用堆栈,不知道哪里错了!求各位大神帮助!!

直接复制代码:
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库真心用的心累,求各位神帮助!!!累到爆炸

1个回答

world680
world680   2017.09.09 10:12

haha,自己找到了,在这里分享一下吧!!那个在这里面用了克隆,pBpolygon.clone(),这个函数传出的是一个地址,应该是在堆栈中创建了和pBpolygon同样大小的内存空间,把这个地址存起来,在程序末尾把它delete,内存泄漏消失了,问题得到解决。。。。。。

Csdn user default icon
上传中...
上传图片
插入图片