为什么 free 出错?

gyscsdn 2005-11-22 05:05:11

char * cReqStr;
char * cPayStr;
REQUEST * reqStruct;
PAYMENT * payStruct;

log->WriteFile(_T("Java_nnes_cm_CmPaymentNativeMethods_telegramProc Start"));

cReqStr = jstring2window(env,reqStr);
cPayStr = jstring2window(env,payStr);


reqStruct = getRequestStructMFC(cReqStr);
payStruct = getPaymentStructMFC(cPayStr);

log->WriteFile(_T("Java_nnes_cm_CmPaymentNativeMethods_telegramProc getPaymentStruct end"));

free(cReqStr);
cReqStr = NULL;
free(cPayStr);
cPayStr = NULL;

log->WriteFile(_T("Java_nnes_cm_CmPaymentNativeMethods_telegramProc free end"));

// start
IOpClient* i_opc = new IOpClient;
IRequestTelegram* i_rq = new IRequestTelegram;
IPaymentTelegram* i_py = new IPaymentTelegram;
IResultTelegram* i_rs = new IResultTelegram;

CoInitialize(NULL);

log->WriteFile(_T("Java_nnes_cm_CmPaymentNativeMethods_telegramProc CoInitialize(NULL) end"));


i_opc->CreateDispatch("StandardOpclient.OpClient");
i_rq->CreateDispatch("StandardOpClient.RequestTelegram");
i_py->CreateDispatch("StandardOpClient.PaymentTelegram");
i_rs->CreateDispatch("StandardOpClient.ResultTelegram");

log->WriteFile(_T("Java_nnes_cm_CmPaymentNativeMethods_telegramProc CreateDispatch end"));

i_rq->SetMallid((*reqStruct).mallid);
i_rq->SetTermno((*reqStruct).termno);
i_rq->SetOrder((*reqStruct).order);
i_rq->SetGcode((*reqStruct).gcode);
i_rq->SetPaydate((*reqStruct).paydate);
i_rq->SetName((*reqStruct).name);
i_rq->SetCardno((*reqStruct).cardno);
i_rq->SetLimit((*reqStruct).limit);
i_rq->SetPrice((*reqStruct).price);

log->WriteFile(_T("Java_nnes_cm_CmPaymentNativeMethods_telegramProc IRequestTelegram set end"));

i_py->SetPaycode((*payStruct).paycode);
i_py->SetPaysday((*payStruct).paysday);
i_py->SetDivcount((*payStruct).divcount);
i_py->SetBonusm((*payStruct).bonusm);
i_py->SetBonusc((*payStruct).bonusc);
i_py->SetBonusp((*payStruct).bonusp);

log->WriteFile(_T("Java_nnes_cm_CmPaymentNativeMethods_telegramProc IPaymentTelegram set end"));

char * tempStr = new char[256];
strcpy(tempStr , "i_rq->GetMallid()=");
char* rstr = getRealValue(i_rq->GetMallid());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "i_rq->GetTermno()=");
rstr = getRealValue(i_rq->GetTermno());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "i_rq->GetOrder()=");
rstr = getRealValue(i_rq->GetOrder());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "i_rq->GetGcode()=");
rstr = getRealValue(i_rq->GetGcode());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "i_rq->GetPaydate()=");
rstr = getRealValue(i_rq->GetPaydate());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "i_rq->GetName()=");
rstr = getRealValue(i_rq->GetName());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "i_rq->GetCardno()=");
rstr = getRealValue(i_rq->GetCardno());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "i_rq->GetLimit()=");
rstr = getRealValue(i_rq->GetLimit());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "i_rq->GetPrice()=");
rstr = getRealValue(i_rq->GetPrice());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "i_py->GetPaycode()=");
rstr = getRealValue(i_py->GetPaycode());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "i_py->GetPaysday()=");
rstr = getRealValue(i_py->GetPaysday());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "i_py->GetDivcount()=");
rstr = getRealValue(i_py->GetDivcount());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));


strcpy(tempStr , "i_py->GetBonusm()=");
rstr = getRealValue(i_py->GetBonusm());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "i_py->GetBonusc()=");
rstr = getRealValue(i_py->GetBonusc());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "i_py->GetBonusp()=");
rstr = getRealValue(i_py->GetBonusp());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));


log->WriteFile(_T("TelegramProc start"));
//売上処理実行
short sret;
sret = i_opc->TelegramProc(i_rq->m_lpDispatch , i_py->m_lpDispatch , i_rs->m_lpDispatch);

log->WriteFile(_T("TelegramProc end"));

char * intStr = new char[256];
strcpy(intStr , "sret=");
sprintf(intStr + 5,"%d",sret);
log->WriteFile(_T(intStr));
delete intStr;
intStr = NULL;

CString totalResult = "returncode=" + i_rs->GetReturncode();

strcpy(tempStr , "i_rs->GetReturncode()=");
rstr = getRealValue(i_rs->GetReturncode());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

strcpy(tempStr , "totalResult=returncode=");
rstr = getRealValue(i_rs->GetReturncode());
strcat(tempStr,rstr);
delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

//応答電文情報設定
if(sret == 0){

log->WriteFile(_T("sret=0 process call"));

CString data = i_rs->GetData();
CString time = i_rs->GetTime();
CString voucher = i_rs->GetVoucher();
CString approval = i_rs->GetApproval();
CString order = i_rs->GetOrder();
CString price = i_rs->GetPrice();
CString companycode = i_rs->GetCompanycode();
totalResult = "data=" + data + "\n" + "time=" + time + "\n" + "voucher=" +
voucher + "\n" + "approval=" + approval + "\n" + "order=" + order
+ "\n" + "price=" + price + "\n" + "companycode=" + companycode +
"\n" + totalResult;

}
log->WriteFile(_T("totalResult append"));

strcpy(tempStr , "totalResult=");
rstr = getRealValue(totalResult);
strcat(tempStr,rstr);

delete rstr;
rstr = NULL;
log->WriteFile(_T(tempStr));

delete tempStr;
tempStr = NULL;

char * rr = (char *)malloc(totalResult.GetLength() + 1);
strcpy(rr,totalResult);

cResStr = window2jstring(env,rr);

free(rr);
rr = NULL;

log->WriteFile(_T("Java_nnes_cm_CmPaymentNativeMethods_telegramProc window2jstring end"));
try{
log->WriteFile(_T("free((*reqStruct).cardno"));
free((*reqStruct).cardno); //<------------- exception
(*reqStruct).cardno = NULL;
}catch(...)
{
log->WriteFile(_T("free((*reqStruct).cardno error"));
}

.........


...全文
166 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gyscsdn 2005-11-23
  • 打赏
  • 举报
回复
没人能帮我吗?
oyljerry 2005-11-22
  • 打赏
  • 举报
回复
看出错时的具体情况
gyscsdn 2005-11-22
  • 打赏
  • 举报
回复
watch cardno这个变量的地址,没有发生变化
gyscsdn 2005-11-22
  • 打赏
  • 举报
回复
不是每次都出错,无规律性
快乐鹦鹉 2005-11-22
  • 打赏
  • 举报
回复
调试一下,watch cardno这个变量的地址,看看是否发生了变化
gyscsdn 2005-11-22
  • 打赏
  • 举报
回复
to happyparrot:

代码如下:

REQUEST * getRequestStructMFC(char * inputStr)
{
REQUEST * req = (REQUEST*)malloc(sizeof(REQUEST));
CString tempStr;
CString ss;
char* str = NULL;
char * retStr = NULL;
for(int i = 0; i < 9; i++)
{
AfxExtractSubString(tempStr,inputStr,i,'\n');
str = (char*)malloc(tempStr.GetLength() + 1);
strcpy(str,tempStr);
AfxExtractSubString(ss,str,1,'=');
free(str);
str = NULL;
retStr = (char*)malloc(ss.GetLength() + 1);
strcpy(retStr,ss);
if (i == 0)
{
(*req).mallid = retStr;
}
if (i == 1)
{
(*req).termno = retStr;
}
if (i == 2)
{
(*req).order = retStr;
}
if (i == 3)
{
(*req).gcode= retStr;
}
if (i == 4)
{
(*req).paydate = retStr;
}
if (i == 5)
{
(*req).name = retStr;
}
if (i == 6)
{
(*req).cardno = retStr;
}
if (i == 7)
{
(*req).limit = retStr;
}
if (i == 8)
{
(*req).price = retStr;
}
}
return req;






typedef struct a
{
char * mallid;
char * termno;
char * order;
char * gcode;
char * paydate;
char * name;
char * cardno;
char * limit;
char * price;
} REQUEST;
}
快乐鹦鹉 2005-11-22
  • 打赏
  • 举报
回复
并且,为何是释放free((*reqStruct).cardno);而不是free(*reqStruct)呢?或者free(reqStruct)
快乐鹦鹉 2005-11-22
  • 打赏
  • 举报
回复
reqStruct = getRequestStructMFC(cReqStr);
这个函数的帮助信息中说了返回信息需要由外部进行free么?
gyscsdn 2005-11-22
  • 打赏
  • 举报
回复
代码有些长,出错位置在最后:free((*reqStruct).cardno); //<------------- exception

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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