博主开始用的是实验室的电脑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语言的基础课啊^^

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

  1. C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?

    C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题? 问题1:结构体指针最开始怎么分配内存?用sizeof()是不能确定大小的. 问题2:给结构体变量分配之后,是否还要 ...

  2. Redis 数据结构与内存管理策略(上)

    Redis 数据结构与内存管理策略(上) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...

  3. 数据结构堆栈 内存堆栈_了解堆栈数据结构

    数据结构堆栈 内存堆栈 In this article, we'll be understanding the working and the need for the Stack Data Stru ...

  4. 数据结构堆栈 内存堆栈_零堆栈数据科学家第二部分秋天

    数据结构堆栈 内存堆栈 In Hollywood, it is known that the sequels are rarely better than the original movie/par ...

  5. 数据结构----内存分配问题

    一.结构的存储分配 在座各位,肯定都明白机器内存分配对程序的运行效率有多重要.今天,首先我们就来梳一遍结构的存储分配问题.编译器按照成员列表的顺序,依次给每个成员分配空间.只有当存储成员时满足正确的边 ...

  6. redis深度历险_Redis的数据结构(内存具体怎么优化的)

    上一篇我们讲解了Redis中SDS的组成以及优势,这一篇我们讨论下Redis中的Hash数据类型是怎么构成的呢? Java中存在HashMap和HashTable的数据类型.而Hash的数据结构可以近 ...

  7. 堆和栈的区别 之 数据结构和内存

    版权归作者所有,仅供学习. 数据结构的栈和堆 首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈. 堆和栈都是一种数据项按序排列的数据结构. 栈就像装数据的桶或箱子 我 ...

  8. 数据结构和内存中堆和栈的区别

    特别声明:本文参考了博客:http://blog.csdn.net/wolenski/article/details/7951961#comments 堆和栈在 我的眼里一直是很模糊的概念,只是简单的 ...

  9. C++成员函数的内存分配问题

    转自:http://blog.csdn.net/caomiao2006/article/details/4934013 1.所有函数代码都在程序编译连接时放在一块,称为代码区,无论是静态还是非静态函数 ...

最新文章

  1. Python中通过lambda抛异常的奇技淫巧
  2. 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(一)
  3. ranorex自动化测试框架开发--控件操作
  4. juniper防火墙做ipsec ***必须开放的端口
  5. 【牛客 - 331G】炫酷数字(反素数打表 或 扩展埃式筛法,结论)
  6. 外设驱动库开发笔记13:MLX90614红外温度传感器驱动
  7. rx java_你会在实际工作中使用 rxjava 吗?
  8. 在 RAID 磁盘上面架构 LVM 系统
  9. MarkDown 和LaTex语法学习(基于软件Typora)
  10. 国家、省、市、区四联动效果
  11. date_sub函数用法-----随笔记
  12. 不等距双杆模型_电磁感应的双杆模型——不等距无拉力
  13. OpenCL入门二:OpenCL基础概念
  14. 音量(DB)为什么都是负值
  15. 告别20k/s,利用IDM直链下载网盘资源(油猴)
  16. 【评测】小鼠肝细胞系(GHA1、AML12、BNL CL.2)培养实验操作步骤
  17. 原生支付宝小程序对接诸葛io监测
  18. 智百威收银系统服务器,智百威商业连锁管理系统果蔬版
  19. python将矩阵存为lmdb文件
  20. Windows磁盘检测——chkdsk

热门文章

  1. springmvc使用log4j2的配置,以及解决controller日志只有控制台打印日志,不生成本项目文件夹下
  2. 最详细UWB技术及特点介绍
  3. 发展教育数字化,开创教育新局面
  4. 弘辽科技:新手卖家如何制作高点击率主图
  5. 基于区块链的Smart系统-题库及试卷管理模块的设计与开发
  6. 32位与64位机器下各数据类型长度对比
  7. 主角是李逍遥的Java游戏_经典单机游戏仙剑奇侠传一20周年,你所不知道的隐藏剧情...
  8. coreldraw怎么画猴子_猴年画猴:CD11绘制小猴头像(1)
  9. [影视推荐]黑客题材美剧—网络末日战
  10. android——(图片框与进度条)