+ -
当前位置:首页 → 问答吧 → 【问题贴】关于一个小游戏中问题,没发现问题所在,可就是会出错。

【问题贴】关于一个小游戏中问题,没发现问题所在,可就是会出错。

时间:2011-12-01

来源:互联网

程序运行到ontimer进行第9960次左右后自动崩溃,找不出原因,debug发现是int 3?这是什么?反正是汇编的看不懂,求教!
附上源码地址:http://d.1tpan.com/tp1301999514

作者: wangyf112   发布时间: 2011-12-01

int 3错误,可能是内存没有释放掉吧

作者: g6785654   发布时间: 2011-12-01

每次if (nIDEvent == 1) 就分配内存
而不进行释放,应该加上释放内存动作
如:
对话框初始化时
C/C++ code
    ball = firstball=temp = NULL;

if (nIDEvent == 1)    //等级时间间隔计时器
    {        //先是方内存
        temp = ball = firstball;    //恢复ball指针位置
        for ( ;ball != NULL;ball=ball->next)
        {
            free(ball);
        }


另外还可以分配一次内存,重复利用,这样效率更好

作者: gameslq   发布时间: 2011-12-01

可能是缓冲区溢出
调试时,看不到调用堆栈吗?

作者: ouyh12345   发布时间: 2011-12-01

RE:g6785654 
  出错是内存不能为读,不知道什么意思,应该是吧。

RE:gameslq
  用了你的方法,但是在timer(1)第二次就出问题了,if(nIDEvent == 1)中把所有ball free了,但是执行时后面的赋值好像出错了。。。我debug发现if(nIDEvent == 2)中的ball是NULL。
问一下,当开启两个timer会不会在timer1执行到一半时另一个timer2开始执行?

RE:ouyh12345
  "可能是缓冲区溢出
调试时,看不到调用堆栈吗?"这句话怎么说?看不懂啊,菜鸟。。。

作者: wangyf112   发布时间: 2011-12-01

RE:gameslq
  我又试了那个重复利用的,我是每次执行timer1时多加一个ball,那么我就先把所有已存在的ball重新赋值,即C/C++ code

ball = firstball;

while (ball != NULL)
{
    //here赋值
    ball = ball->next;
}
//再新创建一个ball
temp = (BALL*)malloc(sizeof(BALL)); 
memset(temp, 0, sizeof(BALL));

temp->x = rand()%800 +2;
temp->y = 11;
temp->cx = rand()%(num_sum - 4) - 3;
temp->cy = rand()%(num_sum - 4) - 3;

ball = temp;


我用了这个方法,代码对不?我执行发现还是有问题啊,在第一次就出错。

作者: wangyf112   发布时间: 2011-12-01

引用 4 楼 wangyf112 的回复:
RE:g6785654
出错是内存不能为读,不知道什么意思,应该是吧。

RE:gameslq
用了你的方法,但是在timer(1)第二次就出问题了,if(nIDEvent == 1)中把所有ball free了,但是执行时后面的赋值好像出错了。。。我debug发现if(nIDEvent == 2)中的ball是NULL。
问一下,当开启两个timer会不会在timer1执行到……

Debug下call stack,看函数调用堆栈~

作者: VisualEleven   发布时间: 2011-12-01

RE:VisualEleven
  用的是计时器,那个F10不能单步跟踪,call stack后直接是出错的地方了,看不到什么东西,只是ball不存在。。。

作者: wangyf112   发布时间: 2011-12-01