菜菜菜菜鸟关于内存一小问!
菜菜菜菜鸟关于内存一小问!
楼主ajun21century(海落鹰)2001-09-02 20:44:10 在 C++ Builder / 基础类 提问各位大虾,小弟编程试遇到一个问题,程序编译通过一点问题没有,但是关闭窗体的时候提示某段指令引用的某段内存不能为read,我在formclose事件里已经释放了数组的内存和应该释放的对象变量,为什么会这样呢? 问题点数:0、回复次数:13Top
1 楼little_f(小毛)回复于 2001-09-02 21:09:22 得分 0
看看有没有非法的指针使用。你可以自己跟踪一下程序的流程看看问题出在什么地方Top
2 楼gzc(编程工具何其多,我却偏爱BCB)回复于 2001-09-02 21:16:18 得分 0
有没有重复Delete,我以前曾经不小心重复了一次Delete,结果老是出错。Top
3 楼whitelion(www.ccproj.com)回复于 2001-09-02 21:40:19 得分 0
把你的程序全部编译一遍再试试Top
4 楼ajun21century(海落鹰)回复于 2001-09-03 09:02:52 得分 0
跟踪流程找不出来,当然也可能是小弟初学手拙,昨晚找一高手断点跟踪也找不出来,非法的指针是什么样的,肯定没有重复delete。Top
5 楼Ton2000(小顽童XP)回复于 2001-09-03 09:11:48 得分 0
在关闭窗口时出问题,你再仔细看看关闭窗口时的代码吧!
要不你把源码贴出来让大伙看看。。。Top
6 楼ajun21century(海落鹰)回复于 2001-09-03 09:42:20 得分 0
问题不是出在关闭窗口时的代码,我把它屏蔽掉以后一样出毛病,我把代码贴出来吧,大家帮我看看。是一个五子棋程序。
#include <vcl.h>
#pragma hdrstop
#include "five_f.h"
#include "mem.h"
#include "string.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//画棋盘
void TForm1::DrawGame()
{
int step,width;
step=20;
width=280;
PaintBox1->Canvas->Pen->Color=clBlack;
PaintBox1->Canvas->Brush->Color=clBlack;
for(int i=0;i<15;i++)
{
PaintBox1->Canvas->MoveTo(0,step*i);
PaintBox1->Canvas->LineTo(width,step*i);
PaintBox1->Canvas->MoveTo(step*i,0);
PaintBox1->Canvas->LineTo(step*i,width);
if(i==3||i==7||i==11) //画要点
{
for(int j=3;j<12;j+=4)
{
PaintBox1->Canvas->MoveTo(j*20,i*20);
PaintBox1->Canvas->Ellipse(j*20-3,i*20-3,j*20+3,i*20+3);
}
}
}
}
//----------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
DrawGame();
if(Stepnum>=1)
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
if(qizi)
DrawQizi(qizi,i,j);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
int step,hang,lie;
step=Stepnum%2==0?1:2;
hang=Y%20<10?Y/20:Y/20+ 1;
lie=X%20<10?X/20:X/20+1;
if(SetQizi(step,hang,lie))
{
DrawQizi(step,hang,lie);
Stepnum++;
}
else
Application->MessageBoxA("落子错误!","提示!",MB_OK);
if(Iswin(step,hang,lie))
{
Application->MessageBoxA("赢了!","提示!",MB_OK);
PaintBox1->Canvas->Brush->Color=clBtnFace;
PaintBox1->Canvas->FillRect(Form1->Canvas->ClipRect);
DrawGame();
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
qizi=0;
Stepnum=0;
}
}
//---------------------------------------------------------------------------
//判断是否5子连成一线
bool TForm1::Iswin(int player,int hang,int lie)
{
for(int i=4;i>=0;i--)
//遍历行
{
if(qizi==player&&
qizi==player&&
qizi==player&&
qizi==player&&
qizi==player)
return(true);
//遍历列
if(qizi==player&&
qizi==player&&
qizi==player&&
qizi==player&&
qizi==player)
return(true);
//遍历两对角线
if(qizi==player&&
qizi==player&&
qizi==player&&
qizi==player&&
qizi==player)
return(true);
//*************
if(qizi==player&&
qizi==player&&
qizi==player&&
qizi==player&&
qizi==player)
return(true);
}
return(false);
}
//-------------------------------------------------------------------------
//将棋子信息赋值给数组
bool TForm1::SetQizi(int player,int hang,int lie)
{
if(!qizi)
{qizi=player;
return(true);
}
return(false);
}
//--------------------------------------------------------------------------
//画棋子
void TForm1::DrawQizi(int player,int hang,int lie)
{
if(player==1)
PaintBox1->Canvas->Brush->Color=clBlack;
else
PaintBox1->Canvas->Brush->Color=clWhite;
PaintBox1->Canvas->Ellipse(lie*20-10,hang*20-10,lie*20+10,hang*20+10);}
//-----------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//初始化步数和棋子数组
Stepnum=0;
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
qizi=0;
Edit1->Text="";
Edit1->Enabled=false;
}
//---------------------------------------------------------------------------
//按理说问题出在下面的代码,但是我已经屏蔽掉了,也一样出错!!!
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
//memset(qizi,0,sizeof(short)*225);
//Application->Terminate();
}
//---------------------------------------------------------------------------
//监视鼠标位置
void __fastcall TForm1::PaintBox1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
Edit1->Text=IntToStr(X)+","+IntToStr(Y)+","+IntToStr(Stepnum);
}
//---------------------------------------------------------------------------
Top
7 楼dycdyc123(重出江湖)回复于 2001-09-03 09:44:48 得分 0
重新完全编译!!!!Top
8 楼ajun21century(海落鹰)回复于 2001-09-03 09:52:59 得分 0
编译的时候成功,然后关闭窗体的时候提示出现异常,错误的代码指示在“ /* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { } ”Top
9 楼ajun21century(海落鹰)回复于 2001-09-03 11:52:14 得分 0
请诸位大虾帮我看看吧!Top
10 楼gzc(编程工具何其多,我却偏爱BCB)回复于 2001-09-03 15:49:03 得分 0
你的棋子数组qizi是不是该定义为全局数组?再重新完全编译一次试试!Top
11 楼ajun21century(海落鹰)回复于 2001-09-03 16:47:49 得分 0
qizi数组就是定义的全局变量!Top
12 楼gzc(编程工具何其多,我却偏爱BCB)回复于 2001-09-03 16:54:49 得分 0
呵呵,这个我就不知道了,不好意思,帮你推推吧,希望高手解答!Top
13 楼ajun21century(海落鹰)回复于 2001-09-03 21:09:02 得分 0
问题还没有解决啊,谁来帮我?Top
-
相关文章
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn
