有谁能帮我看看为什么在释放内存的时候会报错?五一快乐,40分相赠!

heavenb 2005-05-02 05:27:23
/***********HEAD FILES*******************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

/***********GLOBAL MACROS***************/
#define DEBUG
#define GLOBAL
#define CALLBACK
#define FALSE 0
#define TRUE 1
#define MAX_CMD_COUNT 100
#define DEFAULT_CMD_COUNT 1
#define NULL 0
#define HEAP_COUNT 200

/***********GLOBAL TYPEDEFINE***************/
typedef int BOOL;
typedef void (*pRegCommand) (void) ;
typedef struct
{
char* CmdString;
pRegCommand CmdEntry;
}CmdStructure;


typedef struct
{
void* HeapPtr;
int iLineNum;
int iSize;
BOOL bUse;
}ArrHeapDump;




/***********GLOBAL VARIABLE***************/

GLOBAL char strCmd[10];
GLOBAL char* strPrompt="SocketUDP>>";
GLOBAL BOOL bSystemExit=FALSE;
GLOBAL int iCurrentHeapCount=0;
GLOBAL int CurrentCmdNum=1;

GLOBAL ArrHeapDump arrHeapCount[HEAP_COUNT];

GLOBAL CmdStructure* arrCmdList[MAX_CMD_COUNT];

DEBUG void DEBUG_MESSAGE(void * msg)
{
printf("DEBUG_MESSAGE:%08x\n",msg);
}

DEBUG void DEBUG_MemoryDump()
{
int ix;
int nCount=0;
printf("MemDump:\n");
for(ix=0;ix<iCurrentHeapCount;ix++)
{
if(arrHeapCount[iCurrentHeapCount].bUse==TRUE)
{
printf("LINE:%d\tADDRESS:%08x\tSIZE:%08x\n",
arrHeapCount[iCurrentHeapCount].iLineNum,
arrHeapCount[iCurrentHeapCount].HeapPtr,
arrHeapCount[iCurrentHeapCount].iSize);
nCount++;
}
}
printf("Dump Item=%d\n",nCount);
}
GLOBAL void * Malloc_Dump(int iSize,int LineNum)
{

void *p;
iCurrentHeapCount++;
p=malloc(iSize);
assert(p!=0);
arrHeapCount[iCurrentHeapCount-1].HeapPtr=p;
arrHeapCount[iCurrentHeapCount-1].iLineNum=LineNum;
arrHeapCount[iCurrentHeapCount-1].iSize=iSize;
arrHeapCount[iCurrentHeapCount-1].bUse=TRUE;
return p;
}

GLOBAL void Free_Dump(void* p)
{
free((void*)p);
arrHeapCount[iCurrentHeapCount].bUse=FALSE;
arrHeapCount[iCurrentHeapCount].HeapPtr=NULL;
iCurrentHeapCount--;
}





GLOBAL void System_Exit()
{
bSystemExit=TRUE;
}

GLOBAL BOOL RUTIME_InitCommand()
{
BOOL bRet;
if(arrCmdList[CurrentCmdNum-1]!=NULL)
{
arrCmdList[CurrentCmdNum-1]->CmdEntry=System_Exit;
arrCmdList[CurrentCmdNum-1]->CmdString="Exit";
bRet=TRUE;
}
else
{
bRet=FALSE;
}
return bRet;
}

GLOBAL BOOL RUNTIME_RegistCommand(void* cmdEntry,char *cmdName)
{
assert(cmdName!=NULL);
CurrentCmdNum++;
arrCmdList[CurrentCmdNum-1]=(CmdStructure*)Malloc_Dump(sizeof(arrCmdList[0]),__LINE__);
arrCmdList[CurrentCmdNum-1]->CmdEntry=(pRegCommand)cmdEntry;
arrCmdList[CurrentCmdNum-1]->CmdString=cmdName;


return TRUE;
}

GLOBAL void RUNTIME_InitSystem()
{
int ix;
CurrentCmdNum=DEFAULT_CMD_COUNT;




for(ix=0;ix<CurrentCmdNum;ix++)
{
arrCmdList[ix]=NULL;
}
for(ix=0;ix<CurrentCmdNum;ix++)
{
DEBUG_MESSAGE((void *)arrCmdList[ix]);
arrCmdList[ix]=(CmdStructure* )Malloc_Dump(sizeof(arrCmdList[ix]),__LINE__);
DEBUG_MESSAGE((void *)arrCmdList[ix]);
}
RUTIME_InitCommand();
}


GLOBAL void TermSystem()
{
int ix;
for(ix=0;ix<CurrentCmdNum;ix++)
{
Free_Dump((void*)arrCmdList[ix]);
arrCmdList[ix]=NULL;
CurrentCmdNum=1;
}
}
void test()
{
printf("Hello");
}
int main()
{
RUNTIME_InitSystem();
RUNTIME_RegistCommand((void*)test,"test");

while(1)
{

printf(strPrompt);
gets(strCmd);
printf("\n");
switch(strCmd[0])
{
case 'e':
{
printf("Exit System.\n");
bSystemExit=TRUE;
break;
}
default:
break;
}
if(bSystemExit)
{
break;
}

}
TermSystem();
DEBUG_MemoryDump();
return 0;
}
...全文
714 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanxinhuofeng 2005-05-16
  • 打赏
  • 举报
回复
分步试调一下,你具体要问什么?
HappyCoolBoy 2005-05-15
  • 打赏
  • 举报
回复
up 太迷糊
xiaolele 2005-05-12
  • 打赏
  • 举报
回复
up
zharry 2005-05-07
  • 打赏
  • 举报
回复
给个建议,代码写一点就测试(除非对这个代码已经很有把握了),
这样你的错误就能被锁定在一个小的范围内,调试就轻松多了!
dzw2004 2005-05-07
  • 打赏
  • 举报
回复
up~
Hzj_jie 2005-05-06
  • 打赏
  • 举报
回复
单步调试吧,顶一下
cs_cn2004 2005-05-05
  • 打赏
  • 举报
回复
顶顶吧!!!
bluwindhrt 2005-05-03
  • 打赏
  • 举报
回复
longlijun(风之力)与Olive_Eagle(橄榄鹰) 已经回答了
帮顶吧!
xiabao 2005-05-03
  • 打赏
  • 举报
回复
mark
TylerY 2005-05-03
  • 打赏
  • 举报
回复
头晕,这样的代码叫人怎么看啊!
heavenb 2005-05-02
  • 打赏
  • 举报
回复
谢谢各位!!
jjyjjyjjy 2005-05-02
  • 打赏
  • 举报
回复
唉,这么长没一点注释要人怎么看?注释,注释。注释。啊,养成良好编程习惯吧,一看到这样的代码就头疼。
Olive_Eagle 2005-05-02
  • 打赏
  • 举报
回复
你的程序中的两处
arrCmdList[ix]=(CmdStructure* )Malloc_Dump(sizeof(arrCmdListix]),__LINE__);
换成
arrCmdList[ix]=(CmdStructure* )Malloc_Dump(sizeof(CmdStructure),__LINE__);


即可以运行通过!!!


你的具体要求是什么, ???
富莱工作室 2005-05-02
  • 打赏
  • 举报
回复
arrCmdList[ix]=(CmdStructure* )Malloc_Dump(sizeof(arrCmdList[ix]),__LINE__);
改为以下:

arrCmdList[ix]=(CmdStructure* )Malloc_Dump(sizeof(CmdStructure),__LINE__);

你在问题在于分配的空间不够, sizeof(arrCmdList[ix] 仅为4字节,
useresu 2005-05-02
  • 打赏
  • 举报
回复
好复杂,

其实这种错误楼主自己单步调试一下,
一定能发现错误,

而让别人看的程序就太费劲了,

就算是帮顶吧.
somedummy 2005-05-02
  • 打赏
  • 举报
回复
好歹也要给出一个合适的输入吧……总不能你要别人帮你调错还要人把你的整个程序读懂吧……

另外,目前有一个NULL的重定义,我加了#ifdef NULL解决了,还有一个是System_Exit的参数问题,应该是没有参数的,但是你没有用void修饰……
brucelee0224 2005-05-02
  • 打赏
  • 举报
回复
学习
zhousqy 2005-05-02
  • 打赏
  • 举报
回复
mark
yuhjnm_20001 2005-05-02
  • 打赏
  • 举报
回复
ding
hoya5121 2005-05-02
  • 打赏
  • 举报
回复
这么长的代码,要好一会看的.
不如把错误的范围缩小下,让大家可以从几句代码中来解决问题,不是很好吗?

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧