循环new 类的对象来存储数据 最后怎么删除释放内存

skyline0093 2011-10-11 05:14:10
void CWaveView::OnWave()
{
// TODO: Add your command handler code here
KillTimer(1);
m_Wave.RemoveAll();//用来保存每次绘图后的对象地址 删除指针 释放内存

//打开mat文件
MATFile *pMatFile=NULL;
mxArray *pMxArray=NULL;
double *pMat1=NULL;
int m,n;
pMatFile=matOpen("D:\\Program Files\\MATLAB71\\work\\Wave_Data.mat", "r");//返回文件指针
if(pMatFile==NULL)
{
AfxMessageBox("没有打开文件");
}
else
{
pMxArray=matGetVariable(pMatFile, "WaveData");
if(pMxArray==NULL)
{
AfxMessageBox("没有数据");
}
else
{
pMat1=mxGetPr(pMxArray);//获得数据首地址
m=mxGetM(pMxArray);
n=mxGetN(pMxArray);
int j=m_Wave_Num;
for(int i=0;i<m*n;i=i+2)//循环采集次数
{
if(j==m*n)
{j=0;}
m_Data.x=pMat1[j];
m_Data.y=pMat1[j+1];
CData *pdata=new CData(m_Data);
m_Wave.Add(pdata);
j=j+2;
}
m_Wave_Num=m_Wave_Num+2;//用于定位从哪个数据开始读
}
matClose(pMatFile);
mxFree(pMxArray);
mxFree(pMatFile);
m_RepaintWave=1;
Invalidate(true);
UpdateWindow();
OnWaveTimer();

}
}程序大概是读一个MAT文件的数据 画图 然后启动定时器后重新读文件画图 利用数组实现动态显示 但是我觉得CData *pdata=new CData(m_Data);这一句不断用对象存储的数据保存在堆里一直没有释放 所以不知如何释放 谢谢 除此编程 希望各位大牛给以指导谢谢
...全文
388 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gameslq 2011-10-11
  • 打赏
  • 举报
回复
因为程序走一会后弹出一个对话框 显示程序停止了
我觉得是内存泄露?

应该是这个原因
释放 语句

for ( int i=0;i<m_Wave.GetSize();i++)
delete m_Wave[5];

m_Wave.RemoveAll();

skyline0093 2011-10-11
  • 打赏
  • 举报
回复
我感觉第一次读数据 在堆中存放 画图 好像没有释放 m_Wave.RemoveAll();释放的只是指向堆得指针 但是堆中的数据没有释放 不知道怎么释放 求解 谢谢
skyline0093 2011-10-11
  • 打赏
  • 举报
回复
程序是读MAT 文件 然后画图 保存数据是采纳孙鑫的第11章 用CPtrArray 这个类来保存 所以有了CData *pdata=new CData(m_Data);
m_Wave.Add(pdata);
这两句。 用OnWaveTimer();是启动定时器 每隔一秒重新读文件 画图。因为要求动态,所以通过调整指针,当文件数据没变化时 循环输出。画图时采用的双缓存画法 CData这个新建类主要是因为数据都是double型 所以新建一个CData::CData(PointD m_nData){this->m_nData=m_nData;}画图的语句如((CData*)m_Wave.GetAt(i))->m_nData.x;这是第一次编程 所以有很多函数或者类都是用的很蹩脚 但是想继续下去 图能画出来 但是那个NEW 感觉好像一直没释放 不知道怎么释放
注:m_Data,m_nData都是PointD类型(自建的结构体)PointD(double X, double Y):x(X),y(Y){};

gameslq 2011-10-11
  • 打赏
  • 举报
回复
m_Wave.RemoveAll();//用来保存每次绘图后的对象地址 删除指针 释放内存
这个语句执行之前要遍历m_Wave 对象每个指针调用delete m_Wave[i] 释放内存
用定时器的目地是什么?代码中pMatFile=matOpen("D:\\Program Files\\MATLAB71\\work\\Wave_Data.mat", "r");涉及的文件经常会变化吗?
如果一直不变化,用双缓冲画图,读一次文件即可。
即使经常变化也要用双缓冲画图,不然读文件太频繁了。
凤矶 2011-10-11
  • 打赏
  • 举报
回复
m_Wave.Add() 此方法的参数的释放约定是怎样的?有源码看源码,没源码读说明文档。
演地 2011-10-11
  • 打赏
  • 举报
回复
用CData pdata不行么?非要要指针的话就在m_Wave.Add(pdata)下面释放掉pdata。
oyljerry 2011-10-11
  • 打赏
  • 举报
回复
保存pdata,然后当不需要的时候delete

16,551

社区成员

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

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

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