在for循环里继续套用for循环,导致内存不足无法进行编译调试该怎么解决?

代码如下,一共4个for循环逐个套用,导致循环次数过大,程序目的为OPENGL中直线与三角面片求交点

 

{

    CLine *pLine;
    CFacet *facet,*facet1;
    CVertex *pvertex0,*pvertex1;
	double x0,y0,z0,x1,y1,z1,x2,y2,z2,X0,Y0,Z0,t0;
	int i;
   	double x000,y000,z000,x111,y111,z111,x222,y222,z222,x333,y333,z333; 
	double x01,y01,z01,a0,b0,c0,a1,b1,c1,S0,S1,S2,S3,p0,p1,p2,p3;
	double x11,y11,z11,x22,y22,z22; 
	double x001,y001,z001;   
    POSITION pos,pos0,pos1;
                          
	
	x0=0;
	y0=0;
	z0=5;
	
	m_jiaodian1.RemoveAll();
	m_jiaodian2.RemoveAll();

	
	
		x1=x0;
		y1=y0;
		z1=-10;                //点

		x2=100*cos(1);                            //另一个点
		y2=100*sin(1);
		z2=z1;

        X0=x1+cos(1)*t0;
		Y0=y1+sin(1)*t0;                           //参数方程
		Z0=0;

    	
  

		for(pos = m_zhongjiandaociqumian.GetHeadPosition();pos!=NULL; )    //求一条投影线与所有三角面片所在平面的交点
		{
			facet=(CFacet*)m_zhongjiandaociqumian.GetNext(pos);

	  	    x11=facet->m_dNormal.x;
		    y11=facet->m_dNormal.y;
		    z11=facet->m_dNormal.z;

		    x22=facet->m_dVertex1.x;
		    y22=facet->m_dVertex1.y;
		    z22=facet->m_dVertex1.z;

        //    x11*(X1-x22)+y22*(Y1-y22)+z22(Z1-z22)=0;    //面方程,需不需要?好像不需要
			
			t0=((x22-x1)*x11+(y22-y2)*y11+(z22-z2)*z11/(x11*cos(1)+y11*sin(1)+z11*0));
            
			x01=x1+cos(1)*t0;
			y01=y1+sin(1)*t0;
			z01=z1;
			
			pvertex0=new CVertex;

	    	pvertex0->x=x01;
	    	pvertex0->y=y01;
	    	pvertex0->z=z01;

		    m_jiaodian1.AddTail(pvertex0);





			for(pos1 = m_zhongjiandaociqumian.GetHeadPosition();pos1!=NULL; )
			{
				pvertex0=(CVertex*)m_jiaodian1.GetNext(pos1);

				x001=pvertex0->x;
				y001=pvertex0->y;
				z001=pvertex0->z;



            
			    for(pos0 = m_zhongjiandaociqumian.GetHeadPosition();pos0!=NULL;)  //确定与三角面片的交点
				{
				facet1=(CFacet*)m_zhongjiandaociqumian.GetNext(pos0);


				                                                //三角面片三个顶点

	        	x000=facet1->m_dNormal.x;
		        y000=facet1->m_dNormal.y;
	        	z000=facet1->m_dNormal.z;

	            x111=facet1->m_dVertex1.x;
	        	y111=facet1->m_dVertex1.y;
	        	z111=facet1->m_dVertex1.z;
		
	        	x222=facet1->m_dVertex2.x;
	        	y222=facet1->m_dVertex2.y;
	        	z222=facet1->m_dVertex2.z;

	        	x333=facet1->m_dVertex3.x;
	        	y333=facet1->m_dVertex3.y;
	         	z333=facet1->m_dVertex3.z;

				                                                                
				a0=sqrt(pow(x111-x222,2)+pow(y111-y222,2)+pow(z111-z222,2));   //计算三角面片三条边的长度
				b0=sqrt(pow(x111-x333,2)+pow(y111-y333,2)+pow(z111-z333,2));
				c0=sqrt(pow(x333-x222,2)+pow(y333-y222,2)+pow(z333-z222,2));

				a1=sqrt(pow(x001-x111,2)+pow(y001-y111,2)+pow(z001-z111,2));      //计算交点到三角面片三个顶点的距离
				b1=sqrt(pow(x001-x222,2)+pow(y001-y222,2)+pow(z001-z222,2)); 
				c1=sqrt(pow(x001-x333,2)+pow(y001-y333,2)+pow(z001-z333,2)); 



	        	p0=(a0+b0+c0)/2;                                          //海伦公式计算三角面片面积和三个小三角形的面积
				S0=pow(p0*(p0-a0)*(p0-b0)*(p0-c0),0.5);      
					
				p1=(a0+a1+b1)/2;
				S1=pow(p1*(p1-a0)*(p1-a1)*(p1-b1),0.5);

				p2=(b0+a1+c1)/2;
				S2=pow(p2*(p2-b0)*(p2-a1)*(p2-c1),0.5);

				p3=(c0+b1+c1)/2;
				S3=pow(p3*(p3-c0)*(p3-b1)*(p3-c1),0.5);


				if(fabs(S1+S2+S3-S0)<0.1)
				{
					pvertex1=new CVertex;                     	//如果在三角面片上,存入新链表
				    	
					pvertex1->x=x001;
	    	        pvertex1->y=y001;
	            	pvertex1->z=z001;

					m_jiaodian2.AddTail(pvertex1);
				}
				
				}
		

			}
				

		}

    
}

 

求交点的话,你能用一个简单的数据集么?具体错误是什么?

你需要考虑 m_jiaodian1 和 m_jiaodian2 哪些地方用完后可以删掉。内存不足肯定是两处new 分配的对象过多。

  • 要么是逻辑问题,不应该分配这么多,那就是你的算法需要改进。
  • 要么是真得分配这么多,那你要考虑如何在分配后一旦用完不可能会再次被用时就立刻delete掉。
  • 要么是真得分配这么多,还都不能删,那你就要考虑是否把必要的数据持久化到磁盘,需要的时候按需读取,维持一个小的内存缓存,保证能跑,牺牲点读写磁盘的性能损耗。
  • 要么,你还可以考虑如何用更少的内存表示点数据结构。