调用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()");
}
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()");
}
解决方案 »
- ACCESS 文本包含单引号无法录入
- 对象序列化,有指针成员变量怎么办?可能多个对象共同指向一个对象
- ActiveX触发JS事件
- 高高高手请进!在线等,急!!!马上结
- 不用derictX,如何播放,暂停,停止一段MIDI文件
- 史上最强!超级矢量图形开发控件!VC++开发示例!
- 如何开始学习钩子?
- 热烈庆祝本人红月角色升级超过200级,撒分!!!!!
- 请问高手,我的机器现在不知道怎么了?能用IE上网,但我的QQ就是在我的机器上就是显示“连接超时”,在其他的机器上我的QQ一点问题都没有
- 有什么方法可以实现在文件的中间插入、删除?而不是常规的在文件结尾操作?
- 一个想不明白的地方
- 怎么得到非模态对话框指针?
{
//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))
{
//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()");
}
delete pData;//在这个位置,不能delete null pointer,
是调试到mySDList.AddTail(pCSmpData);//调试到这句,
会Debug Assertion Failed。和delete pData没关系吧。
---------------------------------------------------------
我知道这句多余double* pData = new double[1024];//多余!
那高手来说说阿,再线等
急!!!
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又是什么
pwnd->MessageBox("File Open Failed!","ERROR",MB_OK ¦MB_ICONWARNING);
这里貌似pwnd是没有赋值,肯定会出错;
void CMyDoc::InitSmpData()
{
double* pData = NULL/*new double[1024]*/;
//既然函数返回了分配好的内存,就不要再分配了。
//当然删除还是要删除的
pData = ReadConvertData();
1 你的文件长度能保证大于 60 + 1024 ×2 字节吗?
2 CWnd* pwnd;
pwnd->MessageBox("File Open Failed!","ERROR",MB_OK|MB_ICONWARNING);这里的pwnd没有初始化。指向无效地址。
3 mySDList 是什么东西,是成员变量吗?他的地址有效吗?
4 delete 用的位置不正确。
1。文件大于60+1024的
2。pwnd确实没有初始化,不过没有关系,我只想调用CWnd::MessageBox()而以,
并且现在我也改成GetMainWnd()->MessageBox()了,以防万一
3。CObList* mySDList//init :mySDList = new CObList();
要改正上面mySDList->AddTail(pCSmpData)
---------------------------------------------------------------
---------------------------------------------------------------
仍然有问题,还是那个样子
上述几步得操作不是对同一个对象引起的
上面两个函数是在另一个函数中被调用的
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);//操作的不是同一对象的原因
具体我下午在改改,看是不是这个原因
释放一个null指针是安全的