new delete 释放内存问题

shiyunqiang 2012-03-07 10:45:33
代码如下:


unsigned char* template;
int template_length;

CString DataStyle=_T("data(*.dat)|*.dat||");
CFileDialog dlg(TRUE,NULL,FALSE,NULL,DataStyle,NULL);
(dlg.m_ofn).lpstrTitle="open data";
if (dlg.DoModal()==IDOK)
{
dlg.CenterWindow();
CString m_strdataPath=dlg.GetPathName();
FILE*fp;
int i=0;
fp=fopen(m_strdataPath,"r");
if (fp==NULL)
{
AfxMessageBox(_T("Load data failed!"));
}


fscanf( fp, _T("%d\n"), &template_length);

template=new unsigned char[template_length];

while(!feof(fp))
{
fscanf( fp, _T("%d "), &template[i]);
i++;
}

delete[] template;

}


运行到delete[] template;就失败。
...全文
133 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiyunqiang 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kusey 的回复:]

晕,我在三楼就提到这个问题了,怎么没给我分呀!哎......
[/Quote]

昨天结贴时忘记给你加分了,实在不好意思,今天重新开了一个加分贴,你回复一下,我给你加分。
连接如下:
http://topic.csdn.net/u/20120308/09/ebaac4eb-43cb-4b75-bf78-8f8edcc180be.html?23167
shiyunqiang 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kyotrue 的回复:]

超界了,破坏了内存分配链。
scanf指定%d是读入整型,windows上整型是4字节的,不会管你传入的是int指针还是char指针,都会按照int来处理,用传入地址开始的4个字节来存储数据,因此最后一个循环时你就超界3字节了。写个例子试一下就知道了。
C/C++ code
unsigned char test[8] = { 0 };
::_stscanf(_T("1234……
[/Quote]

的确是这个问题,谢谢kyotrue!
同时对参与的朋友表示感谢!
kyotrue 2012-03-07
  • 打赏
  • 举报
回复
超界了,破坏了内存分配链。
scanf指定%d是读入整型,windows上整型是4字节的,不会管你传入的是int指针还是char指针,都会按照int来处理,用传入地址开始的4个字节来存储数据,因此最后一个循环时你就超界3字节了。写个例子试一下就知道了。
	unsigned char test[8] = { 0 };
::_stscanf(_T("123456789"), _T("%d"), &test[3]);

可以先用一个int临时变量接收scanf结果,然后再将值赋给char数组。
dahaiI0 2012-03-07
  • 打赏
  • 举报
回复
是不是报 Heap corruption detected error,如果是可以按5楼的方法,个人习惯new了后memset下.
rolandoo 2012-03-07
  • 打赏
  • 举报
回复
template=new unsigned char[template_length] 改成

template=new unsigned char[template_length+1];
再試看看
sdpxpxp 2012-03-07
  • 打赏
  • 举报
回复
你debug跟踪到的fscanf( fp, _T("%d\n"), &template_length); 返回值是多少?
kusey 2012-03-07
  • 打赏
  • 举报
回复
fscanf( fp, _T("%d "), &template[i]);

你定义的 unsigned char 类型的数组
存的是 int 型的数值

估计这块出错了
shiyunqiang 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kusey 的回复:]

估计是 template 申请的内存大小不够,你取得的 template_length 小于文件中数字个数
[/Quote]

文件中200个数据,template_length获取的第一个数字是保存文件的数据量,我将template_length的数组扩大到10000也是释放不成功。
kusey 2012-03-07
  • 打赏
  • 举报
回复
估计是 template 申请的内存大小不够,你取得的 template_length 小于文件中数字个数
kusey 2012-03-07
  • 打赏
  • 举报
回复
晕,我在三楼就提到这个问题了,怎么没给我分呀!哎......

16,471

社区成员

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

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

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