100分求助解决内存问题,在线等,急啊~~~

kinker 2005-06-26 09:40:39
有一段从IC卡读数据的代码,每次读去一段数据后内存回增加,但是读完以后内存并不减少,请高手指点。不够再开贴加分。

下面是这段读数据到磁盘上的代码。

HINSTANCE hDllHandler = LoadLibrary("MCS_SR.dll");
if (hDllHandler == NULL) //没有找到资源
{
return FALSE;
}

WORD (FAR __stdcall * pAT45D_BundleReadChar)(DWORD _dwAddr,DWORD _dwLength,BYTE *_bReadData);

pAT45D_BundleReadChar = (WORD (FAR __stdcall *)(DWORD,DWORD,BYTE *))(GetProcAddress(hDllHandler,"AT45D_BundleReadChar"));

FILE *fp;
char fname[MAX_PATH];
unsigned char temp[265] = {0};
CString strCurDir = ((CITMAApp *)AfxGetApp())->GetAppDirectory();
sprintf(fname,"%stemp.dat",strCurDir);
if((fp=fopen(fname,"wb+")) != NULL)
{
reader.MCS_SetStringMode(HEXADECIMAL);
WORD flag = 0;

//开始按照页读取数据
int i = wFirstPage;
i = 0;
wFirstPage = 0;
wLastPage = 2047;
for (; i <= wLastPage; i++)
{
flag = pAT45D_BundleReadChar(i,264,temp);

if(flag)
{
reader.Close();
fclose(fp);
return false;
}
::PostMessage(hWnd,WM_HAVEDONECOUNT,(WPARAM)(i - wFirstPage),(LPARAM)(wLastPage -wFirstPage) );

fwrite(temp,264,1,fp);

if(::WaitForSingleObject(KillThreadEvent,0) == WAIT_OBJECT_0)
{
break;
}
}
fclose(fp);
}

if (hDllHandler != NULL)
{
FreeLibrary(hDllHandler);
hDllHandler = NULL;

TRACE0("已释放动态链接库:MCS_SR.dll\n");
}
...全文
176 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
tatu 2005-06-28
  • 打赏
  • 举报
回复
好,祝贺!
kinker 2005-06-26
  • 打赏
  • 举报
回复
TO: tatu()

我用你介绍的方法试了,读完一张卡后内存增加果然是加倍了。

那么如果是这个函数里面的内存问题,现在要从外部怎么能解决呢?
kinker 2005-06-26
  • 打赏
  • 举报
回复
这个就是文档

AT45D_BundleReadChar
AT45D_BundleReadChar 函数从AT45D系列卡片的存储区读取一串字符。此函数受MCS_SetStringMode影响。

WORD AT45D_BundleReadChar(
DWORD _dwAddr,
DWORD _dwLength,
BYTE *_bReadData
);

参数
_dwAddr
指定要读取的字符串在卡内的地址。

_dwLength
指定要读取的字符串长度。

_bReadData
字符型指针,指向从卡片存储区内读到的字符串并返回给应用程序。在HEXADECIMAL模式下,应用程序应确保在调用此函数前,已分配给_bReadData指针至少_dwLength个字节的空间;在ASCIISTRING模式下,应确保已分配给_bReadData指针至少(_dwLength * 2)个字节的空间。

返回值
如果函数调用成功,返回值为0,且_bReadData的内容为从卡片读取到的字符串。

如果函数调用失败,返回值不为0。如需得到错误描述,请调用MCS_ErrorMsg。

说明
此函数从卡片内的_dwAddr字节地址起读取_dwLength字节长的字符串。

与AT45D_ReadChar的区别在于,此函数将卡片存储区的第0页的0地址视为0地址连续操作,当地址或长度超过一页的页长时,地址不回绕而是自动跳到下一页的0地址继续操作。另外,对于大数据量的操作做了优化,因此当进行大数据量操作时速度优于AT45D_ReadChar。

兼容性


Windows NT: 4.0以后版本。
Windows: Windows 95以后版本。
头文件: MCS_SR.h。
静态库: MCS_SR.lib。
动态库: MCS_SR.dll。
xing_xing_xing 2005-06-26
  • 打赏
  • 举报
回复
仔细看pAT45D_BundleReadChar的文档
hxzb7215191 2005-06-26
  • 打赏
  • 举报
回复
看代码。

你是使用了一个dll文件,使用了动态调用的方式来调用DLL文件中的一个函数。

可能就是这个DLL文件中的函数内存没有释放。
kinker 2005-06-26
  • 打赏
  • 举报
回复
好,等一下
tatu 2005-06-26
  • 打赏
  • 举报
回复
再定义一个数组temp2,然后pAT45D_BundleReadChar(i,264,temp2),试试内存增加的情况?
kinker 2005-06-26
  • 打赏
  • 举报
回复
内存的增加情况差不多,就是想看是不是 pAT45D_BundleReadChar(i,264,temp);
造成的内存分配,就 这样子重复调用

for()
{
pAT45D_BundleReadChar(i,264,temp);
pAT45D_BundleReadChar(i,264,temp);
pAT45D_BundleReadChar(i,264,temp);

pAT45D_BundleReadChar(i,264,temp);

pAT45D_BundleReadChar(i,264,temp);

pAT45D_BundleReadChar(i,264,temp);


.....

}
查看这样的内存使用情况,还是差不多增加,没有出现内存成倍增加的现象。

tatu 2005-06-26
  • 打赏
  • 举报
回复
没太看明白你的意思,重复调用两次的时候是怎样的?
kinker 2005-06-26
  • 打赏
  • 举报
回复
没有格式不好看,从新把循环的代码贴一下。

if((fp=fopen(fname,"wb+")) != NULL)
{
reader.MCS_SetStringMode(HEXADECIMAL);
WORD flag = 0;

//开始按照页读取数据
int i = wFirstPage;
i = 0;
wFirstPage = 0;
wLastPage = 2047;
for (; i <= wLastPage; i++)
{
flag = pAT45D_BundleReadChar(i,264,temp);

if(flag)
{
reader.Close();
fclose(fp);
return false;
}
::PostMessage(hWnd,WM_HAVEDONECOUNT,(WPARAM)(i - wFirstPage),(LPARAM)(wLastPage -wFirstPage) );

fwrite(temp,264,1,fp);

if(::WaitForSingleObject(KillThreadEvent,0) == WAIT_OBJECT_0)
{
break;
}
}
fclose(fp);
}
kinker 2005-06-26
  • 打赏
  • 举报
回复
不是啊,内存增加是在循环里面,而使用的只有一个数组temp,和一个函数pAT45D_BundleReadChar(i,264,temp),当我把这个读取的函数屏蔽掉后内存就没有什么增加的,我怀疑是厂家提供的动态连接库中的这个函数内部有内存分配,造成了内存泄露。但是奇怪的是当我在这个 循环内部重复调用6次这个函数时候,内存的增加量并没有加倍,还是和调用一个的时候相当,感觉又不象是这个原因,我就非常的迷惑了。。。


望高手能帮我解释一下,分不够,我会继续开贴,只要能解决问题就好。
oyljerry 2005-06-26
  • 打赏
  • 举报
回复
内存是否new开辟的,记得delete
kinker 2005-06-26
  • 打赏
  • 举报
回复
我怎么转了一下帖子就没有缩进格式了??
kinker 2005-06-26
  • 打赏
  • 举报
回复
查清楚了,就是这个动态连接库的函数的内存没有释放,导致了内存泄露!真该死。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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