关于数据结构的内存分配问题

博主开始用的是实验室的电脑VS2013,我也不知道是vs2013是没有还是我不会用,在surface上装了vs2015之后调试程序有内存监控【不过我现在发现直接可以在控制面板里找哈哈,就是在运行上一篇博文所展示程序的时候,突然发现占用内存呈线性增加。。这好像有点不太对劲


就是这样,我当时想这个事情太可怕了,那么我的程序就是在吃内存啊。。我这里有一个鼠标获取坐标的语句,因此就是在做一个无限循环,是没有终止的,那么这样的话,如果我不进行终止程序,他就会一直运行下去。。过不了多长时间就会把内存吃光。

不知道VS2013有没有这样的功能。。如果有的话我会在之后的知识结构上补上的。或者有热心网友可以帮帮我找找。


其实我最终想到的解决方法表明这跟我的定义方法有关系,因为把定义语句都放到了展示函数里,而主函数在不停的调用展示函数,而又没有及时地释放内存,就会不停的分配新的内存给他。这也许就是传说中的内存泄漏【并没有系统学过C捂脸求不嘲笑,

可能通过及时释放内存的方法也可以达到防止内存泄漏的方法。我这里采取的方法是首选将定义放到了函数外,也就是说,定义的变量都是适合全局的

struct HE_vert  *v[8];
struct HE_edge  *e[6][4];
struct HE_face  *f[6];

void idv()
{
	for (int i = 0; i < 8; i++)
	{
		v[i] = (HE_vert*)malloc(sizeof(HE_vert));
	}
}


void ide()
{
	for (int i = 0; i < 6; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			e[i][j] = (HE_edge*)malloc(sizeof(HE_edge));
		}
	}
}


void idf()
{

	for (int i = 0; i < 6; i++)
	{
		f[i] = (HE_face*)malloc(sizeof(HE_face));
	}
}
而且可能是我太笨了。。连直接分配内存都不会。。由重新令了三个函数。。其中我也不知道为什么在同一个函数里分配不行。真是各种不会。。

这里值得注意的是,如果我在展示函数中调用

idv();
ide();
idf();

是不行的。。

这种吃内存的速度简直是太吓人了,每秒钟都有1M到2M半小时就能把我的内存吃掉,可是把上面三个函数放到主函数里就没问题了,本来以为大功告成了,发现改动过后是这样的


哦哦哦,原来还有东西在吃,最后就是把

struct HE_edge *en = (HE_edge*)malloc(sizeof(HE_edge));

这句语句放到函数外面去定义

修改的最终版本在此

#include <windows.h>
#include <math.h>            
#include <gl/GL.h>            
#include <GL/glut.h>  


//static const GLfloat vertex_list[][3] = {  
//  -0.5f, -0.5f, -0.5f,  
//  0.5f, -0.5f, -0.5f,  
//  0.5f, 0.5f, -0.5f,  
//  -0.5f, 0.5f, -0.5f,  
//  -0.5f, -0.5f, 0.5f,  
//  0.5f, -0.5f, 0.5f,  
//  0.5f, 0.5f, 0.5f,  
//  -0.5f, 0.5f, 0.5f,  
//};  


GLfloat colors[][3] = {
	{ 1.0, 0.0, 0.0 },
	{ 1.0, 1.0, 0.0 },
	{ 0.0, 1.0, 0.0 },
	{ 0.0, 1.0, 1.0 },
	{ 1.0, 0.0, 1.0 },
	{ 0.0, 0.0, 1.0 },
	{ 0.0, 0.5, 0.0 },
	{ 0.0, 0.5, 0.5 },
};

//static const GLint index_list[][4] = {  
//  0, 1, 2, 3,//bottem          
//  0, 3, 7, 4,//left          
//  2, 3, 7, 6,//front          
//  1, 2, 6, 5,//right          
//  0, 1, 5, 4,//back          
//  4, 5, 6, 7//top          
//};  

float M_PI = 3.14159265f;


static float c = M_PI / 180.0f; //弧度和角度转换参数    
static int du = 90, oldmy = -1, oldmx = -1; //du是视点绕y轴的角度,opengl里默认y轴是上方向    
static float r = 3.1f, h = 0.0f; //r是视点绕y轴的半径,h是视点高度即在y轴上的坐标    
float zoom = 1.0f;


typedef struct HE_vert
{

	float x;
	float y;
	float z;

	struct HE_edge  *edge;  // one of the half-edges emantating from the vertex  

}HE_vert;

typedef struct HE_edge
{
	struct HE_vert *vert;   // vertex at the end of the half-edge  
	struct HE_edge *pair;   // oppositely oriented adjacent half-edge   
	struct HE_face *face;   // face the half-edge borders  
	struct HE_edge *next;   // next half-edge around the face  
}HE_edge;


typedef struct HE_face
{

	struct HE_edge *edge;  // one of the half-edges bordering the face  

}HE_face;

struct HE_vert  *v[8];
struct HE_edge  *e[6][4];
struct HE_face  *f[6];

void idv()
{
	for (int i = 0; i < 8; i++)
	{
		v[i] = (HE_vert*)malloc(sizeof(HE_vert));
	}
}


void ide()
{
	for (int i = 0; i < 6; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			e[i][j] = (HE_edge*)malloc(sizeof(HE_edge));
		}
	}
}


void idf()
{

	for (int i = 0; i < 6; i++)
	{
		f[i] = (HE_face*)malloc(sizeof(HE_face));
	}
}
struct HE_edge *en = (HE_edge*)malloc(sizeof(HE_edge));


void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glEnable(GL_DEPTH_TEST);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(80.0f, 1.0f, 1.0f, 1000.0f);
	glMatrixMode(GL_MODELVIEW);
	


	
	//初始化点  
	v[0]->x = -0.5f; v[0]->y = -0.5f; v[0]->z = -0.5f; v[0]->edge = e[0][0];
	v[1]->x = 0.5f; v[1]->y = -0.5f; v[1]->z = -0.5f; v[1]->edge = e[0][1];
	v[2]->x = 0.5f; v[2]->y = 0.5f; v[2]->z = -0.5f; v[2]->edge = e[0][2];
	v[3]->x = -0.5f; v[3]->y = 0.5f; v[3]->z = -0.5f; v[3]->edge = e[0][3];
	v[4]->x = -0.5f; v[4]->y = -0.5f; v[4]->z = 0.5f; v[4]->edge = e[5][0];
	v[5]->x = 0.5f; v[5]->y = -0.5f; v[5]->z = 0.5f; v[5]->edge = e[0][3];
	v[6]->x = 0.5f; v[6]->y = 0.5f; v[6]->z = 0.5f; v[6]->edge = e[0][2];
	v[7]->x = -0.5f; v[7]->y = 0.5f; v[7]->z = 0.5f; v[7]->edge = e[0][1];

	//struct HE_edge  
	//{  
	//  HE_vert* vert;   // vertex at the end of the half-edge  
	//  HE_edge* pair;   // oppositely oriented adjacent half-edge   
	//  HE_face* face;   // face the half-edge borders  
	//  HE_edge* next;   // next half-edge around the face  
	//};  
	//初始化边  
	e[0][0]->vert = v[1]; e[0][0]->pair = e[4][3]; e[0][0]->face = f[0]; e[0][0]->next = e[0][1];
	e[0][1]->vert = v[2]; e[0][1]->pair = e[3][3]; e[0][1]->face = f[0]; e[0][1]->next = e[0][2];
	e[0][2]->vert = v[3]; e[0][2]->pair = e[2][3]; e[0][2]->face = f[0]; e[0][2]->next = e[0][3];
	e[0][3]->vert = v[0]; e[0][3]->pair = e[1][3]; e[0][3]->face = f[0]; e[0][3]->next = e[0][0];

	e[1][0]->vert = v[7]; e[1][0]->pair = e[2][2]; e[1][0]->face = f[1]; e[1][0]->next = e[1][1];
	e[1][1]->vert = v[4]; e[1][1]->pair = e[5][0]; e[1][1]->face = f[1]; e[1][1]->next = e[1][2];
	e[1][2]->vert = v[0]; e[1][2]->pair = e[4][0]; e[1][2]->face = f[1]; e[1][2]->next = e[1][3];
	e[1][3]->vert = v[3]; e[1][3]->pair = e[0][3]; e[1][3]->face = f[1]; e[1][3]->next = e[1][0];

	e[2][0]->vert = v[6]; e[2][0]->pair = e[3][2]; e[2][0]->face = f[2]; e[2][0]->next = e[2][1];
	e[2][1]->vert = v[7]; e[2][1]->pair = e[5][1]; e[2][1]->face = f[2]; e[2][1]->next = e[2][2];
	e[2][2]->vert = v[3]; e[2][2]->pair = e[1][0]; e[2][2]->face = f[2]; e[2][2]->next = e[2][3];
	e[2][3]->vert = v[2]; e[2][3]->pair = e[0][2]; e[2][3]->face = f[2]; e[2][3]->next = e[2][0];

	e[3][0]->vert = v[5]; e[3][0]->pair = e[4][2]; e[3][0]->face = f[3]; e[3][0]->next = e[3][1];
	e[3][1]->vert = v[6]; e[3][1]->pair = e[5][2]; e[3][1]->face = f[3]; e[3][1]->next = e[3][2];
	e[3][2]->vert = v[2]; e[3][2]->pair = e[2][0]; e[3][2]->face = f[3]; e[3][2]->next = e[3][3];
	e[3][3]->vert = v[1]; e[3][3]->pair = e[0][1]; e[3][3]->face = f[3]; e[3][3]->next = e[3][0];

	e[4][0]->vert = v[4]; e[4][0]->pair = e[1][2]; e[4][0]->face = f[4]; e[4][0]->next = e[4][1];
	e[4][1]->vert = v[5]; e[4][1]->pair = e[5][3]; e[4][1]->face = f[4]; e[4][1]->next = e[4][2];
	e[4][2]->vert = v[1]; e[4][2]->pair = e[3][0]; e[4][2]->face = f[4]; e[4][2]->next = e[4][3];
	e[4][3]->vert = v[0]; e[4][3]->pair = e[0][0]; e[4][3]->face = f[4]; e[4][3]->next = e[4][0];

	e[5][0]->vert = v[7]; e[5][0]->pair = e[1][1]; e[5][0]->face = f[5]; e[5][0]->next = e[5][1];
	e[5][1]->vert = v[6]; e[5][1]->pair = e[2][1]; e[5][1]->face = f[5]; e[5][1]->next = e[5][2];
	e[5][2]->vert = v[5]; e[5][2]->pair = e[3][1]; e[5][2]->face = f[5]; e[5][2]->next = e[5][3];
	e[5][3]->vert = v[4]; e[5][3]->pair = e[4][1]; e[5][3]->face = f[5]; e[5][3]->next = e[5][0];
	//struct HE_edge  
	//{  
	//  HE_vert* vert;   // vertex at the end of the half-edge  
	//  HE_edge* pair;   // oppositely oriented adjacent half-edge   
	//  HE_face* face;   // face the half-edge borders  
	//  HE_edge* next;   // next half-edge around the face  
	//};  

	f[0]->edge = e[0][0];
	f[1]->edge = e[1][0];
	f[2]->edge = e[2][0];
	f[3]->edge = e[3][0];
	f[4]->edge = e[4][0];
	f[5]->edge = e[5][0];

	glLoadIdentity();
	gluLookAt(r*cos(c*du)*cos(c*h)*zoom, r*sin(c*h)*zoom, r*sin(c*du)*cos(c*h)*zoom, 0, 0, 0, 0, 1, 0); //从视点看远点,y	轴方向(0, 1, 0)是上方向

	
	//绘制立体图  
	for (int i = 0; i < 6; i++)
	{

		en = f[i]->edge;
		glColor3f(colors[i][0], colors[i][1], colors[i][2]);
		glBegin(GL_POLYGON);
		do {
			{
				glVertex3f(en->vert->x, en->vert->y, en->vert->z);//绘制面
			}
			en = en->next;
		} while (en != f[i]->edge);

		glEnd();
	}



	for (int i = 0; i < 6; i++)
	{

		en = f[i]->edge;

		do {

			glBegin(GL_LINES);
			{
				glVertex3f(en->vert->x, en->vert->y, en->vert->z);//其中每条边由两点组成  
				glVertex3f(en->pair->vert->x, en->pair->vert->y, en->pair->vert->z);//其中每条边由两点组成
			}
			glEnd();
			en = en->next;

		} while (en != f[i]->edge);
		
	}

	
	

	glFlush();
	glutSwapBuffers();
}


void Mouse(int button, int state, int x, int y) //处理鼠标点击    
{
	if (state == GLUT_DOWN) //第一次鼠标按下时,记录鼠标在窗口中的初始坐标    
		oldmx = x, oldmy = y;


	if (state == GLUT_UP && button == GLUT_WHEEL_UP)
	{
		zoom = zoom + 0.2;
		if (zoom >= 2)zoom = 2;

		//glutPostRedisplay();  
	}
	if (state == GLUT_UP && button == GLUT_WHEEL_DOWN)
	{
		zoom = zoom - 0.2;
		if (zoom <= 0.6) zoom = 0.6;
		//glutPostRedisplay();  
	}
}

void onMouseMove(int x, int y) //处理鼠标拖动      
{
	//printf("%d\n",du);      
	du += x - oldmx; //鼠标在窗口x轴方向上的增量加到视点绕y轴的角度上,这样就左右转了      
	h += (y - oldmy); //鼠标在窗口y轴方向上的改变加到视点的y坐标上,就上下转了      
	if (h > 90)
	{
		h = 90;
	}
	else if (h < -90)
	{
		h = -90;
	}
	//if (h>1.0f) h = 1.0f; //视点y坐标作一些限制,不会使视点太奇怪      
	//else if (h<-1.0f) h = -1.0f;      
	oldmx = x, oldmy = y; //把此时的鼠标坐标作为旧值,为下一次计算增量做准备      
}

int main(int argc, char *argv[])
{

	idv();
	ide();
	idf();
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(400, 400);
	glutCreateWindow("OpenGL");
	glutDisplayFunc(display);
	glutIdleFunc(display);  //设置不断调用显示函数    
	glutMouseFunc(Mouse);
	glutMotionFunc(onMouseMove);
	glutMainLoop();
	return 0;
}

监控的效果是这样的


可见如果在被不停的调用会出现之前的情况

内存的分配实在是太重要了。。看来还得补好多C语言的基础课啊^^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拉风小宇

请我喝个咖啡呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值