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
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
TXT在线小说管理器
不知道哪里写错了,各位大神帮忙指点下,告诉怎么进行修改
基于SCOKET的CS聊天工具
做好了不能用 请各位指点,不知道哪里有错误。IP地址不会弄。我的QQ601940219 求大神帮助
求帮助,哪里错了?
#include #include #include using namespace std; int main() { double a,b,c; double n,delta; cin>>n; double i; for(i=1;i { cin>>a>>b>>c; double x1,x2; delta=b*b-4*a*c; cout if (fabs(delt
刚学spring的问题
求看看spring的问题刚刚学习spring,在网上下的demo,感觉也对,就是不知道哪里错了
出现问题的自绘组合框
出现问题的自绘组合框,能不能帮看一下。代码出现崩溃问题,在函数DrawItem中,不知道是哪里错了。
求大神指导哪里错了
#include int table[10]; void lookup(int *t,int *a,int n); int main() {     int k,min,*p;     p = &min;     for(k = 0;k     {         scanf("%d",table+k);     }     lookup(&table,*p,10);   
不知道哪里错了,求指导
创建一个栈,将10、12、14入栈,输出栈顶元素,然后退栈,代码如下 #include const int size=10; class stack {     int stck[size];     int tos; public:     stack(int tos)     {tos=0;};     void push(int ch);     int pop();
c语言初步经典题8--求一个数的各位值
题目:写一个程序,输入x(三位数),输出其个、十、百位,用空格隔开 样例输入:768 样例输出:8 6 7#include <stdio.h> #include <stdlib.h>int main() { unsigned short num; unsigned char temp;//保存每一位的数 int i; printf("请输入要分离位数的整数:")
C语言之基本算法30—数组的灵活应用(一个正整数的各位数字平方和)
//数组的灵活应用! /* ===================================================== 题目:求任意输入一个正整数各位数字的平方和,显示如下: 如输入1234,则显示 1*1+2*2+3*3+4*4=30 ===================================================== */
特殊回文数字:求出5位数和6位数中各位上的数字之和为n的回文数。
问题描述   123321是一个非常特殊的数,它从左边读和从右边读是一样的。   输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。 输入格式   输入一行,包含一个正整数n。 输出格式   按从小到大的顺序输出满足条件的整数,每个整数占一行。 样例输入 52 样例输出 899998 989989 998899 数据规模和约定   1