社区
网络及通讯开发
帖子详情
[高级问题]请教一个高深的问题:为什麽我的程序在分配内存的时候失败?
佣工7001
2004-12-13 03:52:52
最近写一个局域网通讯的程序,差不多的功能都写了,可是现在运行不起来了,跟踪到不一定再什麽地方就会出现内存请求失败!(new char[最多上百KB]),由于位置不定,源代码也没办法贴出来,恳请高人指点一下思路!(另外,刚开始运行就会出现,这是为什麽?我要崩溃了)
...全文
234
11
打赏
收藏
[高级问题]请教一个高深的问题:为什麽我的程序在分配内存的时候失败?
最近写一个局域网通讯的程序,差不多的功能都写了,可是现在运行不起来了,跟踪到不一定再什麽地方就会出现内存请求失败!(new char[最多上百KB]),由于位置不定,源代码也没办法贴出来,恳请高人指点一下思路!(另外,刚开始运行就会出现,这是为什麽?我要崩溃了)
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
佣工7001
2004-12-14
打赏
举报
回复
请高人卡那程序中的SendBuf函数,是不是有问题,我调试的时候发现好像这里的问题.
佣工7001
2004-12-13
打赏
举报
回复
//=====================================================
void __fastcall TClientConnection::Process(long rl)
{
int fh;
AnsiString as,fn;
FormMachine->ShowState(2,"Server Responsed ok");
//**********************
if(state==ssGetingPeer) goto READMOREPEER;
if(state==ssGetingData) goto READMOREDATA;
//**********************
if(strncmp(recBuf,CMD_CLOSE,2)==0)
{socket->Close();goto DONE; }
//**********************
if(strncmp(recBuf,CMD_OK,2)==0)
{FormMachine->ShowState(2,"Server Ack");goto DONE; }
//**********************
if(strncmp(recBuf,CMD_SCFHASH,2)==0)
{
as = machine->cfgFile->ReadString("current","hash","");
memcpy(hash,as.c_str(),32);
if(strncmp(hash,recBuf,32)==0
&& FileExists(machine->cfgFile->ReadString("current","scf",""))) //yes scf is current
{
if(!machine->bRunning)
{
StartWork();
}
Report();
GetPeer();
// Close();
}
else
{
memcpy(hash,recBuf,32);
machine->Stop();
GetName();
}
goto DONE;
}
//**********************
if(strncmp(recBuf,CMD_SCFNAME,2)==0)
{
machine->scName = recBuf+2;
machine->scName.SetLength(rl-2);
GetSCF();
goto DONE;
}
//**********************
if(strncmp(recBuf,CMD_PEER,2)==0)
{
memcpy(&bytesToRead,recBuf+2,sizeof bytesToRead);
SafeDelete(cacheBuf);
SafeNew(cacheBuf,bytesToRead+1);
cachePoint = rl - 2 - sizeof bytesToRead;
memcpy(cacheBuf,recBuf+2+sizeof bytesToRead,cachePoint);
bytesToRead-=(rl -2-sizeof bytesToRead);
if(bytesToRead>0)
state=ssGetingPeer;
else
{state=ssCmd;
*(cacheBuf+cachePoint+1)='\0';
ParsePeers();
}
goto DONE;
}
//**********************
if(strncmp(recBuf,CMD_SCF,2)==0 )
{
memcpy(&bytesToRead,recBuf+2,sizeof bytesToRead);
fn=machine->scPath+machine->scName+".sc";
DeleteFile(fn);
fh = FileCreate(fn);
if(fh<0)throw Exception("不能保存SCF文件:"+fn);
FileWrite(fh,recBuf+2+sizeof bytesToRead ,rl-2-sizeof bytesToRead);
FileClose(fh);
bytesToRead-=(rl -2-sizeof bytesToRead);
if(bytesToRead>0)
state=ssGetingData;
else
{state=ssCmd;
SaveSCF();
StartWork();
}
goto DONE;
}
//**********************
goto DONE;
READMOREDATA:
bytesToRead-=rl;
fn=machine->scPath+machine->scName+".sc";
fh = FileOpen(fn,fmOpenWrite);
if(fh<0)throw Exception("不能保存SCF文件:"+fn);
FileSeek(fh,0,2);
FileWrite(fh,recBuf,rl);
FileClose(fh);
if(bytesToRead>0)
state=ssGetingData;
else
{ state=ssCmd;
SaveSCF();
StartWork();
}
goto DONE;
//**********************
READMOREPEER:
bytesToRead-=rl;
memcpy(cacheBuf+cachePoint,recBuf,rl);
cachePoint += rl;
if(bytesToRead>0)
state=ssGetingPeer;
else
{state=ssCmd;
ParsePeers();
}
goto DONE;
//**********************
DONE:
return;
}
佣工7001
2004-12-13
打赏
举报
回复
to: xelements
char recBuf[2048],sendBuf[2048],*cacheBuf;
开始同样是char*,可是发现此问题后,才改成静态的,不过好像作用不大。
___________________________________
谢谢几位大侠了,我会去试试这样分配内存。
___________________________________
另外,请大家帮看看,我这麽用ServerSocket和ClientSocket写程序不知道是否行得通?以前没接触过,心里没有底。
jiangchun_xn
2004-12-13
打赏
举报
回复
以前我遇到过。上百KB,就是几十MB了,分配大的内存,频繁使用new/delete会有问题。对于大的内存块,我现在使用SysGetMem/SysFreeMem来分配释放内存,就不会有问题了。另外,用malloc/free估计也没有问题。
-------------
我也遇到过,而且从外面看不出来内存分配失败,而是用于API调用发生失败,于是改成GlobalAlloc
xelements
2004-12-13
打赏
举报
回复
recBuf是怎么定义的
xu_xinyu
2004-12-13
打赏
举报
回复
关注。
netsys2
2004-12-13
打赏
举报
回复
你把CODE GUARD打开没有?
打开来看看。
另,频繁使用new-delete造成很多内存碎片,建议你一开始申请一块然后多次使用
佣工7001
2004-12-13
打赏
举报
回复
还有,程序中的SendBuf也是封装的
void MyYield(long MilliSeconds)
{
long lap=0,lastC,nowC;
lastC=GetTickCount();
while(lap<MilliSeconds)
{
nowC=GetTickCount();
lap=nowC-lastC;
Application->ProcessMessages();
}
}
int __fastcall TConnection::SendBuf(void *buf, int count)
{
int r=0;
char g;
memcpy(&g,(char*)buf+1,sizeof g);
/*
if(state==ssWaitResponse)
{
while(r<30) // wait 3 seconds
{MyYield(100);
r++;
if(state!=ssWaitResponse)
break;
}
}
if(state==ssWaitResponse)
return -1;
if(count<10)
*/
MyYield(300); // CMD sending;
SENDING:
r = socket->SendBuf(buf,count);
if(r<0)
{
MyYield(100);
goto SENDING;
}
/*
if(count==2 && g<'5' && g>'1')
state=ssWaitResponse;
*/
return r;
}
jishiping
2004-12-13
打赏
举报
回复
以前我遇到过。上百KB,就是几十MB了,分配大的内存,频繁使用new/delete会有问题。对于大的内存块,我现在使用SysGetMem/SysFreeMem来分配释放内存,就不会有问题了。另外,用malloc/free估计也没有问题。
佣工7001
2004-12-13
打赏
举报
回复
可是我不知道那里错了,这样我贴一段核心代码,大家帮忙看看,有没有问题
void __fastcall TConnection::SocketEvent(TObject* Sender, TCustomWinSocket* Socket, TSocketEvent SocketEvent)
{long rl,len,loops,left;
switch(SocketEvent)
{
case seRead:
if(state==ssWaitResponse)
state=ssCmd;
len = socket->ReceiveLength();
loops = (len+sizeof recBuf -1)/(sizeof recBuf);
left = len;
while(loops>0)
{
rl = min(sizeof recBuf,left);
left -= sizeof recBuf;
loops--;
rl = socket->ReceiveBuf(recBuf,rl);
Process(rl);
}
break;
}
return;
}
void __fastcall TServerConnection::Process(long rl)
{
long size;
//**********************
if(state==ssGetingPeer) goto READMOREPEER;
//**********************
if(strncmp(recBuf,CMD_CLOSE,2)==0)
{
socket->Close();
if(OnClose)OnClose(this);
goto DONE;
}
if(strncmp(recBuf,CMD_GETSCFHASH,2)==0)
{
memcpy(sendBuf,CMD_SCFHASH,2);
memcpy(sendBuf+2,tracker->scf->Hash,32);
SendBuf(sendBuf,32+2);
goto DONE;
}
if(strncmp(recBuf,CMD_GETSCFNAME,2)==0)
{
long l=tracker->scName.Length();
memcpy(sendBuf,CMD_SCFNAME,2);
memcpy(sendBuf+2,tracker->scName.c_str(),l);
SendBuf(sendBuf,l+2);
goto DONE;
}
if(strncmp(recBuf,CMD_GETSCF,2)==0)
{
long l=tracker->scf->Length;
char *buf;
size=l+2+sizeof l;
SafeNew(buf,size);
memcpy(buf,CMD_SCF,2);
memcpy(buf+2,&l,sizeof l);
memcpy(buf+2+sizeof l,tracker->scFileContent,l);
SendBuf(buf,l+2+sizeof l);
delete buf;
goto DONE;
}
if(strncmp(recBuf,CMD_GETPEER,2)==0)
{
long l=tracker->peers->Size;
char* buf;
SafeNew(buf,l+2+sizeof l);
memcpy(buf,CMD_PEER,2);
memcpy(buf+2,&l,sizeof l);
memcpy(buf+2+sizeof l,tracker->peers->ToString().c_str(),l);
SendBuf(buf,l+2+sizeof l);
delete buf;
goto DONE;
}
if(strncmp(recBuf,CMD_REPORT,2)==0)
{
memcpy(&bytesToRead,recBuf+2,sizeof bytesToRead);
SafeDelete(cacheBuf);
SafeNew(cacheBuf,bytesToRead+1);
cachePoint = rl - 2 - sizeof bytesToRead;
memcpy(cacheBuf,recBuf+2+sizeof bytesToRead,cachePoint);
bytesToRead -=(rl -2-sizeof bytesToRead);
if(bytesToRead>0)
state=ssGetingPeer;
else
{state=ssCmd;
Ok(); // response
ParsePeer(cacheBuf);
}
goto DONE;
}
goto DONE;
//**********************
READMOREPEER:
bytesToRead-=rl;
memcpy(cacheBuf+cachePoint,recBuf,rl);
cachePoint += rl;
if(bytesToRead>0)
state=ssGetingPeer;
else
{state=ssCmd;
Ok();
ParsePeer(cacheBuf);
}
goto DONE;
DONE:
return;
}
xelements
2004-12-13
打赏
举报
回复
你提供的信息太少了
搬砖:
程序
中的局部变量是编译时候分配地址的还是运行时分配的呢
太无耻了吧,都没给别人分,,,,
程序
中的局部变量是编译时候分配地址的还是运行时分配的呢? [
问题
点数:40分] https://bbs.csdn.net/topics/350012472 borefo 结帖率 90%
程序
中的局部变量是编译时候分配地址的还是运行时分配的呢? 按照我的理解,局部变量是在栈中分配的,应该是在运行时分配地址的,不知道对不对? 栈是一种先进后出的数据...
Windows操作系统出现内存错误怎么办? 「“0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”」!!
Windows操作系统出现内存错误怎么办使用Windows操作系统的人有时会遇到这样的错误信息: 「“0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”」,然后应用
程序
被关闭。 如果去
请教
一些「高手」,得到的回答往往是「Windows就是这样不稳定」之类的义愤和不屑。其实,这个错误并不一定是Windows不稳定造成的。本文就来简单
“0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”
在网上查到的资料,留着备用 使用Windows操作系统的人有时会遇到这样的错误信息: 「“0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”」,然后应用
程序
被关闭。 如果去
请教
一些「高手」,得到的回答往往是「Windows就是这样不稳定」之类的义愤和不屑。其实,这个错误并不一定是Windows不稳定造成的。本文就来简单分
Linux倒序赋值用molloc函数,
请教
一个
C语言函数malloc的
问题
halazi100 于 2014-11-27 16:24:42发表:malloc和free的原理一、malloc()和free()的基本概念以及基本用法:1、函数原型及说明:void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配
失败
,则返回
一个
空指针(NULL)。关于分配
失败
的原因,应该有多种,比如说空间不足就是一种。vo...
解决IE应用
程序
错误
问题
解决IE应用
程序
错误
问题
解决" 0X000000该内存不能为read" 的方法 现在有很多人在使用donghai制作的电脑公司ghost版的系统,经常会出现“0X000000该内存不能为read”的对话框,作者在最新发布的5。1版本中提到已经完美解决了这个
问题
,但事实上
问题
依然存在,只是比4。1的版本有所改进罢了,如何解决这一烦人的
问题
呢?我们先来认识一下这个
问题
吧: 出现这个...
网络及通讯开发
1,317
社区成员
8,874
社区内容
发帖
与我相关
我的任务
网络及通讯开发
C++ Builder 网络及通讯开发
复制链接
扫一扫
分享
社区描述
C++ Builder 网络及通讯开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章