为什么fclose后的free会失败?请高人们给予指点,谢谢!!

hxh76ahei 2009-07-05 02:24:30
各位高人和大佬们,请教如下的问题, 如下代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FRAME_NUM 8
#define LINE_NUM 16
#define COL_NUM 16
#define BUF_SIZE 1296 /* ((( 4 + 1) * 15 + 6 ) * 16) */

int main()
{

char * pchar;
int i, j, m, dat;
FILE * pfile;

if (NULL == (pfile = (fopen("testfile.txt", "w"))))
{
printf("Unable to open the testfile \n");
return -1;
}

pchar = malloc(BUF_SIZE);
if (NULL == pchar)
{
printf("Unable to allocate memory!\n");
return -1;
}


#if 1
for (i = 0; i < FRAME_NUM; i++)
{
memset(pchar , 0, BUF_SIZE);
dat = 0;
for (j = 0; j < LINE_NUM; j++)
{
for (m = 0; m < COL_NUM -1 ; m++)
{
sprintf((pchar + strlen(pchar)), "%4d ", dat++);
}
sprintf((pchar + strlen(pchar)), "%4d\r\n", dat++);
}

fwrite(pchar, 1, BUF_SIZE, pfile);
}
#endif

fflush(pfile);
fclose(pfile);
_fcloseall();
free(pchar); /*始终会报错*/


return 0;
}


在 debug 下运行,上面的 free(pchar); 始终会报错, 显示缓冲区在用.

在 release 下运行是正常的.

如何在 debug 下也确保上面的 free(pchar); 是成功的呢?

上面的处理会应用在 vxWorks 上, 由于内存受限, 这个操作完了, 内存一定要释放, 这个操作该如何做才确保会成功呢? 请各位老大给予指点,谢谢!!!

...全文
128 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2009-07-05
  • 打赏
  • 举报
回复
sprintf((pchar + strlen(pchar)), "%4d ", dat++);
这句话有问题
strlen 是根据字符串中的\0判断的,malloc 不会直接初始化这个字符数组为0,这句话不会达到你要的效果,你其实是在pchar尾部添加了,你的数据
free debug版本 会检测内存的有效性 ,所以会通过assert报错,release 则不会

你最好用std::string或cstring ,相对简单些,
或者
pchar = malloc(size)
pchar[0] = '\0'


or

memset (pchar ,size,0)
oyljerry 2009-07-05
  • 打赏
  • 举报
回复
free(pchar); 释放前pchar是否有效
if(pchar)
free(pchar);

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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