VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3273|回复: 11

请教:释放内存 的问题

[复制链接]

1

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2021-3-15 12:30:01 | 显示全部楼层 |阅读模式
请教:释放内存 的问题

大家好,在我程序里需要开辟内存缓冲区,我开辟使用以后,在关闭设备,想释放掉这段内存缓冲区,用以下代码:
        if (pData!=NULL)  //pData就是我开辟使用的内存缓冲区
        {
            delete pData;
        }
        pData=NULL;
在没有加这段代码时候,程序很正常,但是在加上以后,编译通过,链接通过,一运行程序,就弹出一个对话框:

Debug Assertion Failed !
Program:D:\test.exe
File:dbgheap.c
Line:1011

Expression :_CrtIsValidHeapPointer (pUserData)

For information on how........

终止                      重试                       忽略


第一次遇到这样的问题,不知道是怎么回事情,请大家帮忙看看。谢谢
回复

使用道具 举报

0

主题

10

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2021-3-15 12:45:02 | 显示全部楼层
指针无效………………
把申请时的代码拿出来溜溜
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2021-3-15 13:00:01 | 显示全部楼层
改成下面这样看看,另外你能保证pData != NULL 时 内存是有效的吗?

if (pData!=NULL) //pData就是我开辟使用的内存缓冲区
{
   delete []pData;
}
pData=NULL;
回复

使用道具 举报

1

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2021-3-15 13:15:01 | 显示全部楼层
好的,代码如下:

void CAd65_testDlg::OnOpenDevice()
{
    // TODO: Add your control notification handler code here
   
    hDevice=Fmad_OpenDevice(0);
    if(hDevice!=INVALID_HANDLE_VALUE)
    {
      m_StatusDisplay.Format("打开成功!\n");
      UpdateData(FALSE);
         
        GetDlgItem(IDC_OpenDevice)->EnableWindow(TRUE);
        GetDlgItem(IDC_StartSample)->EnableWindow(TRUE);
        GetDlgItem(IDC_CloseDevice)->EnableWindow(TRUE);
        UpdateData(FALSE);

   
    }
    else
    {
    m_StatusDisplay.Format("打开失败!\n");
      UpdateData(FALSE);
    }
}



//---------------------------------------------------------------------------------//

void CAd65_testDlg::OnStartSample()
{
    // TODO: Add your control notification handler code here
    BOOL bStatus=FALSE;

    PULONG pData=new ULONG[786432];     //申请内存  !!!!!!!!!!!
    memset(pData,0,3145728);            //全部清0      
    int n = 0 ;


  bStatus=Fmad_WriteN(hDevice , 20);            


  bStatus = Fmad_WriteUserParameter(hDevice, 62, 255);   

                  
  bStatus = Fmad_SelClk(hDevice, FALSE);               

               
  bStatus = Fmad_SetSample(hDevice, 0x3);            


   
  bStatus = Fmad_StartSample(hDevice);         


  bStatus = Fmad_WriteTrigger(hDevice);            
  

    DWORD begin = 0 ;
    DWORD end   = 0 ;
   
  
begin = GetTickCount();
cycle :   while (!Fmad_DataReady(hDevice))
    {
    }
         
    if((n==0)||(n%2==0))
    {
    bStatus=Fmad_GetTrigData(hDevice,pData+(n*0x2000),0x4000*2,0x0);
           n++ ;
    }
    else
    {
    bStatus=Fmad_GetTrigData(hDevice,pData+(n*0x2000),0x4000*2,0x8000);
    n++ ;
    }

         if(n < 64)
    {
    goto cycle ;
    }

    bStatus = false ;
    bStatus = Fmad_SetSample(hDevice, 0x0);            
   
    end = GetTickCount();
    DWORD timeUse = end - begin; //执行所用的毫秒数            
            
    static char BASED_CODE szFilter[] = "二进制文件 (*.dat)|*.dat||";
    CString msg;
    CString sFile;
    CFileDialog dlgFile(FALSE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, \
                        szFilter,NULL);
    dlgFile.m_ofn.lpstrTitle="保存";
    dlgFile.DoModal();
    sFile=dlgFile.GetFileName();
    if(!sFile.IsEmpty())
    {
        int n=sFile.Find(".dat");
        if(n<0)
            sFile=sFile+".dat";
        CFile file;
        if(!file.Open(sFile,CFile::modeCreate|CFile::modeWrite))
        {
            msg.Format("Can't not open the file %s.",sFile);
            AfxMessageBox(msg);
            return;
        }

     file.Write(pData,3145728);   
     file.Close();
/*   
     if (pData!=NULL)  //pData就是我开辟使用的内存缓冲区  ,只要一加上,程 序就出对话框
        {
          delete []pData;
        }
*/
}
}

void CAd65_testDlg::OnCloseDevice()
{
    // TODO: Add your control notification handler code here
          hDevice = Fmad_CloseDevice(hDevice);
            if(hDevice==INVALID_HANDLE_VALUE)
    {
        GetDlgItem(IDC_OpenDevice)->EnableWindow(TRUE);
        GetDlgItem(IDC_StartSample)->EnableWindow(FALSE);
        GetDlgItem(IDC_CloseDevice)->EnableWindow(FALSE);
    }
    else
        AfxMessageBox("Can't Close Device !");
}
回复

使用道具 举报

0

主题

10

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2021-3-15 13:30:01 | 显示全部楼层
就如二楼所说

delete []pData;
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2021-3-15 13:45:01 | 显示全部楼层
PULONG pData=new ULONG[786432]; //申请内存 !!!!!!!!!!!
memset(pData,0,3145728); //全部清0 改成 786432

上面我说错了
回复

使用道具 举报

0

主题

10

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2021-3-15 14:00:01 | 显示全部楼层
memset(pData,0,3145728);
-----------------------
这个对的吧
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2021-3-15 14:15:01 | 显示全部楼层
delete [](ULONG*)pData;
回复

使用道具 举报

1

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2021-3-15 14:30:01 | 显示全部楼层
改成这样:delete [](ULONG*)pData;
还是不行
memset(pData,0,3145728);  是对的  ,是对字节清0
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2021-3-15 14:45:01 | 显示全部楼层
你先屏蔽

file.Write(pData,3145728);
file.Close();

在删除看看
以前我好像遇到过这个问题,一时间想不起来是为什么了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表