博主开始用的是实验室的电脑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();
是不行的。。
哦哦哦,原来还有东西在吃,最后就是把
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语言的基础课啊^^