初学者自己写了个俄罗斯方块,不过在内存方面有很大bug~~~~~
#include "stdafx.h "
#include <iostream>
#define BOTTOM 30
#define RIGHT 20
HINSTANCE hInst;
int coor[BOTTOM+1][RIGHT+1]={0},now,score=0,speed=500,b[8];
HPEN hPen,hClearPen;
HDC hdc;
char scoretext[10];
struct C
{
public:
int x,y;
};
class Blocks
{
public:
int style,centerx,centery;
struct C construct[4];
void set(int *con,int s)
{
style=s;
for(i=0;i <4;i++)
{
construct[i].x=con[i*2];
construct[i].y=con[i*2+1];
}
}
virtual void centerSet(int cx,int cy)
{
}
int reachTop()
{
for(i=0;i <4;i++)
{
if(construct[i].y <=0)
return 1;
else return 0;
}
}
int reachBottom()
{
for(i=0;i <4;i++)
{
if(construct[i].y==(BOTTOM-1)||(coor[construct[i].y+1][construct[i].x]==1))
return 1;
}
return 0;
}
int reachLeft()
{
for(i=0;i <4;i++)
{
if(construct[i].x <=0||(coor[construct[i].y][construct[i].x-1]==1))
return 1;
}
return 0;
}
int reachRight()
{
for(i=0;i <4;i++)
{
if(construct[i].x> =RIGHT||(coor[construct[i].y][construct[i].x+1]==1))
return 1;
}
return 0;
}
int leftMove()
{
for(i=0;i <4;i++)
{
if(reachLeft())
return 0;
}
for(i=0;i <4;i++)
{
construct[i].x--;
}
centerx--;
return 1;
}
int rightMove()
{
for(i=0;i <4;i++)
{
if(reachRight())
return 0;
}
for(i=0;i <4;i++)
{
construct[i].x++;
}
centerx++;
return 1;
}
int downMove()
{
if(reachBottom())
{
for(int k=0;k <4;k++)
coor[construct[k].y][construct[k].x]=1;
return 0;
}
for(i=0;i <4;i++)
{
construct[i].y++;
}
centery++;
return 1;
}
int canChange()
{
for(i=0;i <4;i++)
{
if(construct[i].x <0||construct[i].x> RIGHT)
return 0;
}
return 1;
}
private:
int i;
};
[解决办法]
hPen = CreatePen(PS_SOLID,5,RGB(255,0,0));
hClearPen=CreatePen(PS_SOLID,3,RGB(255,255,255));
hdc = GetDC(hWnd);
类似的这些变量都要在退出作用域的时候relase掉
关于hdc建议不要用delete释放,我以前试过,会出现警告的
[解决办法]
局部变量,局部释放
[解决办法]
“hPen = CreatePen(PS_SOLID,5,RGB(255,0,0));
hClearPen=CreatePen(PS_SOLID,3,RGB(255,255,255));
hdc = GetDC(hWnd);
类似的这些变量都要在退出作用域的时候relase掉”
这两个都是整个程序都用的着的东西啊,我把它们定义为全局变量了啊。
希望高手能给我个明确的答复,或者提供一些有关的内存管理的东西,谢谢了
在你使用这个变量暂时结束时,就应该释放,
比如你这个方块.每下一个使用一次,当下完当前的就要释放以备下一个方块使用.
delete的只能是指针变量.
例如: int *a = new int;
...............
delete a;
a = NULL;
使用完后一定要手动释放资源,为防止野指针还要将释放的部分置为NULL
[解决办法]
我经常用的变量都是设置为全局变量,可是为什么占用的内存还会越来越多呢??实在是很疑惑。希望能给个详细解答或者举个例子,小弟十分感谢
=======================================================
CPen *p;
void load()
{
p = ................
操作
p-> deleteObject();//局部释放
p = NULL;
}
void load2()
{
p = ................
操作
p-> deleteObject();//局部释放
p = NULL;
}
int main()
{
load1();
load2();
}
这样就可以保证内存不会不正常的增长了
明白我的意思了吗???
一次使用一次释放
不过注意:不能用 delete p;
原因不知道,我做的时候这样就会出错.
最后还要把p的指针设为空,防止内存泄露.
[解决办法]
PostQuitMessage(0); ReleaseDC (hWnd, hdc) ;
====================================
我感觉应该先ReleaseDC再PostQuitMessage
先释放资源,再退出程序
[解决办法]
呵呵,以前我也试过这样,不过就不是程序抛锚,而是界面上的显示开始变得很诡异~~~- -!
[解决办法]
太晚了。楼主是等代码都写完了才发现问题?或者是发现了问题还是硬着头皮写完再说?