成员变量为指针数组的问题

lee1800 2009-11-28 12:56:32
大家好 谢谢大家关注我的问题
请大家看下我下面这段程序是否有误..
PaintTable.h

class CPaintTable
{
public:
CPaintTable(void);
public:
~CPaintTable(void);
.........
private:
int *m_Timeindex;
ClrStruct *m_ClrItems;
};


PaintTable.c

CPaintTable::CPaintTable(void)
{
m_Timei = 0;
m_NewResulti = 0;
m_LiveD.Rst =0;
m_LiveD.Data.RemoveAll();
m_LiveD.fn = 0;
}
/*---------------------------------------------------------------------------
* 函数名称:~CPaintTable(void);

* 函数功能:析构函数
----------------------------------------------------------------------------*/
CPaintTable::~CPaintTable(void)
{
delete []m_Timeindex;
delete []m_ClrItems;
}


void CPaintTable::GetAllMatchData(CWnd *pwnd,CStringArray &XMLI,int &ViewW,int &ViewH)
{
int NewResultTemp = 0;
m_XMLItems.Copy(XMLI);
//m_GXML.GetMatchState(m_XMLItems,m_MatchState);
m_GXML.DateNumber(m_XMLItems,m_DateItems);
//按日期排位置
m_GXML.CompositorFunction(m_XMLItems,0,m_XMLItems.GetSize()-1,TimeCompositor);
m_GXML.DataProcessing(m_DateItems,m_XMLItems);//,m_MatchNow);
long CountofItems = 0;
CountofItems = m_XMLItems.GetSize();
//重点在这。。
m_Timeindex = new int [CountofItems];
m_ClrItems = new ClrStruct [CountofItems];
for( int i = 0; i < CountofItems; i++ )
{
if (m_XMLItems.GetAt(i) != _T("$$"))
{
m_ClrItems[i] = m_GXML.ParseXMLClr(m_XMLItems.GetAt(i));
}
if (m_XMLItems.GetAt(i) == _T("%%"))
{
NewResultTemp++;
}
}

CClientDC dc (pwnd);
m_nCellWidth = dc.GetDeviceCaps (LOGPIXELSX);
m_nCellHeight = dc.GetDeviceCaps (LOGPIXELSY) / 4 - 10;
ViewW = nViewWidth;
ViewH = m_nCellHeight * ((CountofItems)*2 - m_DateItems.GetSize() - NewResultTemp );
}
...全文
202 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldn123 2009-12-01
  • 打赏
  • 举报
回复
CPaintTable::CPaintTable(void)
{
m_Timei = 0;
m_NewResulti = 0;
m_LiveD.Rst =0;
m_LiveD.Data.RemoveAll();
m_LiveD.fn = 0;

m_ClrItems = NULL;
m_Timeindex= NULL;


}
/*---------------------------------------------------------------------------
* 函数名称:~CPaintTable(void);

* 函数功能:析构函数
----------------------------------------------------------------------------*/
CPaintTable::~CPaintTable(void)
{
if(m_Timeindex)
delete []m_Timeindex;
if(ClrItems)
delete []m_ClrItems;

}


void CPaintTable::GetAllMatchData(CWnd *pwnd,CStringArray &XMLI,int &ViewW,int &ViewH)
{
int NewResultTemp = 0;
m_XMLItems.Copy(XMLI);
//m_GXML.GetMatchState(m_XMLItems,m_MatchState);
m_GXML.DateNumber(m_XMLItems,m_DateItems);
//按日期排位置
m_GXML.CompositorFunction(m_XMLItems,0,m_XMLItems.GetSize()-1,TimeCompositor);
m_GXML.DataProcessing(m_DateItems,m_XMLItems);//,m_MatchNow);
long CountofItems = 0;
CountofItems = m_XMLItems.GetSize();
//重点在这。。
if(m_Timeindex)
{
delete [] m_Timeindex;
}
m_Timeindex = new int [CountofItems];

if(m_ClrItems)
{
delete [] m_ClrItems;
}

m_ClrItems = new ClrStruct [CountofItems];
for( int i = 0; i < CountofItems; i++ )
{
if (m_XMLItems.GetAt(i) != _T("$$"))
{
m_ClrItems[i] = m_GXML.ParseXMLClr(m_XMLItems.GetAt(i));
}
if (m_XMLItems.GetAt(i) == _T("%%"))
{
NewResultTemp++;
}
}

CClientDC dc (pwnd);
m_nCellWidth = dc.GetDeviceCaps (LOGPIXELSX);
m_nCellHeight = dc.GetDeviceCaps (LOGPIXELSY) / 4 - 10;
ViewW = nViewWidth;
ViewH = m_nCellHeight * ((CountofItems)*2 - m_DateItems.GetSize() - NewResultTemp );
}
lee1800 2009-11-28
  • 打赏
  • 举报
回复
大家帮忙看下 谢谢!
lee1800 2009-11-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 oldn_cc_bird 的回复:]
如果GetAllMatchData被多次调用会有内存泄露.
构造函数中
m_ClrItems = NULL;
m_Timeindex= NULL;
改成
C/C++ codeif(m_Timeindex)
{
delete [] m_Timeindex;
}
m_Timeindex=newint [CountofItems];
if(m_ClrItems)
{
delete [] m_ClrItems;
}
m_ClrItems=new ClrStruct [CountofItems];
[/Quote]

问题的关键就是这 countofItems 要在GetAllMatchData中才得知是大小是多少
但是GetAllMatchData并不是构造函数 请问要怎么处理才好呢?
lee1800 2009-11-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zkw0302 的回复:]
为了访问不越界,最好加成员变量保存数组的大小
[/Quote]
可否详解?
zkw0302 2009-11-28
  • 打赏
  • 举报
回复
为了访问不越界,最好加成员变量保存数组的大小
lee1800 2009-11-28
  • 打赏
  • 举报
回复
谢谢各位大大。。
oldn123 2009-11-28
  • 打赏
  • 举报
回复
如果GetAllMatchData被多次调用会有内存泄露.
构造函数中
m_ClrItems = NULL;
m_Timeindex= NULL;
改成
if(m_Timeindex)
{
delete [] m_Timeindex;
}
m_Timeindex = new int [CountofItems];

if(m_ClrItems)
{
delete [] m_ClrItems;
}
m_ClrItems = new ClrStruct [CountofItems];
zkw0302 2009-11-28
  • 打赏
  • 举报
回复
一定要注意
构造函数中要赋初值
m_Timeindex = NULL;

析构函数中删除之前要判断
if(m_Timeindex != NULL)
{
delete []m_Timeindex;
m_Timeindex = NULL;

}

16,551

社区成员

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

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

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