调用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.   

    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))
      

  2.   

    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()");
    }
      

  3.   

    楼上说的试过了不行啊,
    delete pData;//在这个位置,不能delete null pointer,
    是调试到mySDList.AddTail(pCSmpData);//调试到这句,
    会Debug Assertion Failed。和delete pData没关系吧。
    ---------------------------------------------------------
    我知道这句多余double* pData = new double[1024];//多余!
    那高手来说说阿,再线等
    急!!!
      

  4.   

    一、如果是调用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又是什么
      

  5.   

    CWnd*  pwnd;  
    pwnd->MessageBox("File  Open  Failed!","ERROR",MB_OK  &brvbar;MB_ICONWARNING);  
     
    这里貌似pwnd是没有赋值,肯定会出错;
    void  CMyDoc::InitSmpData()  
    {  
               double*  pData  =  NULL/*new  double[1024]*/;  
    //既然函数返回了分配好的内存,就不要再分配了。
    //当然删除还是要删除的
               pData  =  ReadConvertData();  
      

  6.   

    有几个问题:
    1 你的文件长度能保证大于 60 + 1024 ×2 字节吗?
    2 CWnd* pwnd;
    pwnd->MessageBox("File Open Failed!","ERROR",MB_OK|MB_ICONWARNING);这里的pwnd没有初始化。指向无效地址。
    3 mySDList 是什么东西,是成员变量吗?他的地址有效吗?
    4 delete 用的位置不正确。
      

  7.   

    Anikan(皮皮鱼) 
    1。文件大于60+1024的
    2。pwnd确实没有初始化,不过没有关系,我只想调用CWnd::MessageBox()而以,
       并且现在我也改成GetMainWnd()->MessageBox()了,以防万一
    3。CObList* mySDList//init :mySDList = new CObList();
      要改正上面mySDList->AddTail(pCSmpData)
    ---------------------------------------------------------------
    ---------------------------------------------------------------
    仍然有问题,还是那个样子
      

  8.   

    我现在想可能的错误是
    上述几步得操作不是对同一个对象引起的
    上面两个函数是在另一个函数中被调用的
    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);//操作的不是同一对象的原因
    具体我下午在改改,看是不是这个原因
      

  9.   

    new的用法不对,要一次申请够空间,不能在同一块内存地址反复申请。在C中可用malloc realloc实现,C++则不行,要先释放,然后在申请空间。 另外new和delete一定要配对使用,
    释放一个null指针是安全的