高手帮忙进来看看代码!急用

howardneil2007 2007-06-08 07:14:35
调用InitSmpData()函数会出现严重问题
1.ReadConvertData()函数有内存泄露(i>394时候)
2.InitSmpData()函数调用,在mySDList.AddTail(pCSmpData)这一句,
会Debug Assertion Failed,然后要求终止程序
代码如下:
double* CMyDoc::ReadConvertData()
{
CFile tfile;
char* pFileName = "2005年12月15日22时34分32秒.dat";
if(tfile.Open(pFileName,CFile::modeRead))
{
WORD word;
double* pVData = new double[1024];//digital
tfile.Seek(60,CFile::begin);//
for(int i=0;i<1024;i++)//i>394会检测到内存泄露
{
pVData[i] = 0.0;
tfile.Read(&word,2);
word = word>>4;
if(word >= 2048)
pVData[i] = (-1)*(4096-word)*10.0/4096;
else
pVData[i] = word*10.0/4096;
TRACE("pVData[%d]=%f\n",i,pVData[i]);
}
tfile.Close();
return pVData;
}
else
{
CWnd* pwnd;
pwnd->MessageBox("File Open Failed!","ERROR",MB_OK|MB_ICONWARNING);
return NULL;
}
}

void CMyDoc::InitSmpData()
{
double* pData = new double[1024];
pData = ReadConvertData();
if(pData !=NULL)
{
for(int i = 0;i<1024;i++)
{
CSmpData* pCSmpData = new CSmpData(pData[i],i/SplRate_ext);
mySDList.AddTail(pCSmpData);//调试到这句,会Debug Assertion Failed
} //应该没问题的阿,问题在哪呢???
}
delete[] pData;
TRACE("in the Fuction:IniSmpData()");
}
...全文
253 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
howardneil2007 2007-06-16
  • 打赏
  • 举报
回复
问题解决了
不是上面说的问题
不过还是谢谢大家
zhangyq73 2007-06-10
  • 打赏
  • 举报
回复
new的用法不对,要一次申请够空间,不能在同一块内存地址反复申请。在C中可用malloc realloc实现,C++则不行,要先释放,然后在申请空间。 另外new和delete一定要配对使用,
释放一个null指针是安全的
howardneil2007 2007-06-10
  • 打赏
  • 举报
回复
昨天该了一下午好像不是这个原因
都不知道错在哪?
有没有高手帮帮忙啊
howardneil2007 2007-06-09
  • 打赏
  • 举报
回复
Anikan(皮皮鱼)
1。文件大于60+1024的
2。pwnd确实没有初始化,不过没有关系,我只想调用CWnd::MessageBox()而以,
并且现在我也改成GetMainWnd()->MessageBox()了,以防万一
3。CObList* mySDList//init :mySDList = new CObList();
要改正上面mySDList->AddTail(pCSmpData)
---------------------------------------------------------------
---------------------------------------------------------------
仍然有问题,还是那个样子
Anikan 2007-06-09
  • 打赏
  • 举报
回复
有几个问题:
1 你的文件长度能保证大于 60 + 1024 ×2 字节吗?
2 CWnd* pwnd;
pwnd->MessageBox("File Open Failed!","ERROR",MB_OK|MB_ICONWARNING);

这里的pwnd没有初始化。指向无效地址。
3 mySDList 是什么东西,是成员变量吗?他的地址有效吗?
4 delete 用的位置不正确。
菜牛 2007-06-09
  • 打赏
  • 举报
回复
CWnd* pwnd;
pwnd->MessageBox("File Open Failed!","ERROR",MB_OK ¦MB_ICONWARNING);

这里貌似pwnd是没有赋值,肯定会出错;
void CMyDoc::InitSmpData()
{
double* pData = NULL/*new double[1024]*/;
//既然函数返回了分配好的内存,就不要再分配了。
//当然删除还是要删除的
pData = ReadConvertData();
w_anthony 2007-06-09
  • 打赏
  • 举报
回复
一、如果是调用ReadConvertData()是单线程的话,为了安全起见,建议这样改:
1、double* pVData = new double[1024];//digital
改为
static double pVData[1024]; //digital
2、double* pData = new double[1024];//多余!
pData = ReadConvertData();
……
delete[] pData;
改为
//double* pData = new double[1024];//多余!
double* pData = ReadConvertData();
……
//delete[] pData;
二、如果可能会多线程调用,这样改:
1处不要改,就用你的
2处改为
double* pData = ReadConvertData();
……
if (pData) delete[] pData;
要记住使用完ReadConvertData(),要将非空返回值删掉
三、
CSmpData* pCSmpData = new CSmpData(pData[i],i/SplRate_ext);
mySDList.AddTail(pCSmpData);//
这里有new,没有delete肯定有内存泄露
至于Assertion的问题,不知道你的CSmpData是什么,mySDList又是什么
howardneil2007 2007-06-09
  • 打赏
  • 举报
回复
楼上说的试过了不行啊,
delete pData;//在这个位置,不能delete null pointer,
是调试到mySDList.AddTail(pCSmpData);//调试到这句,
会Debug Assertion Failed。和delete pData没关系吧。
---------------------------------------------------------
我知道这句多余double* pData = new double[1024];//多余!
那高手来说说阿,再线等
急!!!
howardneil2007 2007-06-09
  • 打赏
  • 举报
回复
我现在想可能的错误是
上述几步得操作不是对同一个对象引起的
上面两个函数是在另一个函数中被调用的
void CDatCollectionView::OnImpdata() //CDatCollectionView是我自己建的一个新视图类
{
// TODO: Add your command handler code here
CMyDoc* pDoc = (CMyDoc*) GetDocument();
pDoc->InitSmpData();//调用上面的函数
*************
。。。。。。。
}
----------------------------------------------------------------------------------
CMyDoc* pDoc = (CMyDoc*) GetDocument();//很有可能这句得到的对象不是CMyDoc当前的对象
也就是说和mySDList.AddTail(pCSmpData);//操作的不是同一对象的原因
具体我下午在改改,看是不是这个原因
ok1234567 2007-06-08
  • 打赏
  • 举报
回复
void CMyDoc::InitSmpData()
{
//double* pData = new double[1024];//多余!
double* pData = ReadConvertData();
if(pData !=NULL)
{
for(int i = 0;i<1024;i++)
{
CSmpData* pCSmpData = new CSmpData(pData[i],i/SplRate_ext);
mySDList.AddTail(pCSmpData);//调试到这句,会Debug Assertion Failed
} //应该没问题的阿,问题在哪呢???

delete pData;//在这个位置,不能delete null pointer
}

TRACE("in the Fuction:IniSmpData()");
}
ok1234567 2007-06-08
  • 打赏
  • 举报
回复
void CMyDoc::InitSmpData()
{
//double* pData = new double[1024];//多余!
double* pData = ReadConvertData();
if(pData !=NULL)
{
for(int i = 0;i<1024;i++)
{
CSmpData* pCSmpData = new CSmpData(pData[i],i/SplRate_ext);
mySDList.AddTail(pCSmpData);//调试到这句,会Debug Assertion Failed
} //应该没问题的阿,问题在哪呢???
}
delete[] pData;
TRACE("in the Fuction:IniSmpData()");
}

另外这样写貌似不规范:
char* pFileName = "2005年12月15日22时34分32秒.dat";
if(tfile.Open(pFileName,CFile::modeRead))
直接写成:
if(tfile.Open("2005年12月15日22时34分32秒.dat",CFile::modeRead))

systemthink 2007-06-08
  • 打赏
  • 举报
回复
关注...

16,472

社区成员

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

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

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