0
点赞
收藏
分享

微信扫一扫

注意VC的内存使用,栈变量不可放在全局容器


2011年,3月,编者:李国帅

编程序要小心谨慎,符合规则使用程序。

对象定义

class CDataAttibute:public CObject //通用数据结构

{

public:

CDataAttibute()

{

m_fx=0.0F;

m_fy=0.0F;

m_csTag ="";

m_fValue ="";

m_csClass ="";

}

CDataAttibute(double dx,double dy)

:m_fx(dx),m_fy(dy)

{

}

~CDataAttibute()

{

}

public:

double m_fx;

double m_fy;

CString m_csTag;

CString m_fValue;

CString m_csClass;

CDataAttibute & operator= (CDataAttibute &pDataAttibute) //重载 = 算符

{

if(&pDataAttibute == this)

return *this;

m_fx = pDataAttibute.m_fx;

m_fy = pDataAttibute.m_fy;

m_csTag = pDataAttibute.m_csTag;

m_fValue = pDataAttibute.m_fValue;

m_csClass = pDataAttibute.m_csClass;

return *this;

}

};

对象使用


public:

CObArray aryData;

void CWinDialogDlg::OnBnClickedButton1()

{

CDataAttibute data_attibute;

data_attibute.m_fx = 1;

data_attibute.m_fy = 2;

data_attibute.m_csClass ="World";

data_attibute.m_fValue ="NewCuntry";

data_attibute.m_csTag ="new Area";

aryData.Add(&data_attibute);//把一个临时对象的指针放在公共对象是不对的。

CDataAttibute* pdata_attibute = new CDataAttibute;

*pdata_attibute = data_attibute;

aryData.Add(pdata_attibute);//应该这样做

}

void CWinDialogDlg::OnBnClickedButton4()

{

int nCount = aryData.GetCount();//2

CDataAttibute* pdata_attibute0 = (CDataAttibute*)aryData.GetAt(0);//内存已经被释放

CDataAttibute* pdata_attibute1 = (CDataAttibute*)aryData.GetAt(1);//正常获取。

ASSERT(pdata_attibute0->m_fx == 0);//浮点比较有问题

delete pdata_attibute0;//错误,内存已经释放

delete pdata_attibute1;

aryData.RemoveAt(1);

aryData.RemoveAt(0);

}

举报

相关推荐

0 条评论