WEB 开发 开发语言 Java 技术 .Net 技术 数 据 库 硬件使用
图象媒体 Linux/Unix 移动平台 嵌入开发 Windows 专区 软件工程
Ajax 技术 | ASP | PHP | ASP.NET | C# | JSP | Access | Oracle | 网页设计 | Flash | 安全专题 | IIS | VC/MFC | Delphi | C/C++
 你的位置:首页 > 开发语言 > VC/MFC

new的问题
[ 来源:ITWENKU 时间:2007-4-17 12:35:34 | 浏览:218人次 ]

MAPSTRTOSTR是结构体,CDerivMapStrToStrList是CList的模板,
当执行delete FactorStrToStr;释放该指针时,指针被释放的同时,其指向的内容也丢失了,导致StrFactorList保存的值也没了,为什么?如果不delete FactorStrToStr又将导致内存泄漏,怎么解决呢?


LPMAPSTRTOSTR FactorStrToStr=new MAPSTRTOSTR();
FactorStrToStr->Sign=FactorStr;
FactorStrToStr->Value=EditTextContent;

CDerivMapStrToStrList StrFactorList; //保存系数的联表
StrFactorList.RemoveAll();

//保存系数数组到联表中
StrFactorList.AddTail(FactorStrToStr);


if(FactorStrToStr!=NULL)
delete FactorStrToStr; 导致StrFactorList保存的值也没了



在数据从StrFactorList中删除前释放


在析构函数里释放FactorStrToStr


你处理的方法十分的奇怪。既然要保存FactorStrToStr,就要在FactorStrToStr已经不使用的情况下再销毁。不过即使这样你的方法还是很怪。
我给你种方法
用CPtrList m_List;//这是一个记录指针的链表。
在使用的时候你的代码可以改为:
LPMAPSTRTOSTR *FactorStrToStr=new MAPSTRTOSTR();
FactorStrToStr->Sign=FactorStr;
FactorStrToStr->Value=EditTextContent;

CPtrList strFactorList;
//保存系数数组到联表中
StrFactorList.AddTail(FactorStrToStr);
FactorStrToStr = NULL;
delete FactorList;
当然,这个delete并没有真正释放你的结构,在不使用这个结构的时候,还是要手动用delete来释放的。

写到这里我可以肯定你是没有使用正确,你参考的代码明显也是记录的指针。在:
FactorStrToStr->Sign=FactorStr;
FactorStrToStr->Value=EditTextContent;
中的->符号中就可以看出来了。



改成:
MAPSTRTOSTR FactorStrToStr;
FactorStrToStr.Sign=FactorStr;
FactorStrToStr.Value=EditTextContent;

CDerivMapStrToStrList StrFactorList; //保存系数的联表
StrFactorList.RemoveAll();

//保存系数数组到联表中
StrFactorList.AddTail(FactorStrToStr);





上楼的只看语法错误,不看问题的!!!


你new出来的指针变量保存到StrFactorList里面后,暂时不要删除;在StrFactorList不用的时候,从StrFactorList中取出指针再删除。


感谢minger909(惜之)和大家的指点;

我还有点不明白:

由于在这个函数Fun1中必须多次分配MAPSTRTOSTR内存,并保存它
在CDerivMapStrToStrList StrFactorList中,而后在另外一个
函数Fun2(在不同的类中)中调用由StrFactorList保存的值,调用后就可以释放它,

我的问题是:由于MAPSTRTOSTR多次分配,我是否要利用循环来对此释放MAPSTRTOSTR内存?

呵呵..这个问题有点弱智. 分不够我再加




void CDerivListCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
LPNMITEMACTIVATE ItemActivate=(LPNMITEMACTIVATE)pNMHDR;
ClickedRow=ItemActivate->iItem;
//从树型控件中获取选中的表格
CDerivTreeCtrl* pTree=(CDerivTreeCtrl*)GetParent()->GetDlgItem(IDC_TREE_TABLENAME);
CString m_Tree_SelTable=pTree->GetItemText(pTree->GetSelectedItem());
///如果是m_ListDisplay控件
CDerivListCtrl* pListCtrl=(CDerivListCtrl*)GetParent()->GetDlgItem(IDC_LIST_DISPLAY);
if(this==pListCtrl)
{
//获取公式输入编辑控件
CCalParamDlg* pCaCalParamDlg=((CDataManageView*)GetParent())->pCalParamDlg;
CDerivEdit* pEditExpression=(CDerivEdit*)pCaCalParamDlg->GetDlgItem(IDC_EDIT_EXPRESSION);
//获取编辑控件中初始文本,DispEditExprText用于显示在编辑控件中的文本,EditExprText用于
//底层计算的文本
CString DispEditExprText;
pEditExpression->GetWindowText(DispEditExprText);


/////////如果是击了在CCalParamDlg类中的选择系数按钮准备添加公式/////////////////
if(IsDrawRect) //如果点击了在CCalParamDlg类中的选择系数按钮
{
CDerivMapStrToStrList StrContentList; //保存M[][]内容的联表
StrContentList.RemoveAll();
CDerivMapStrToStrList StrFactorList; //保存系数的联表
StrFactorList.RemoveAll();

LPMAPSTRTOSTR FactorStrToStr=new MAPSTRTOSTR(); //保存在变量中
LPMAPSTRTOSTR ContentStrToStr=new MAPSTRTOSTR(); //保存在变量中

if("COEFFICIENT"==m_Tree_SelTable) //如果选择的是系数表格
{
CEncapsulateADO ADOObj;
CString FactorStr="K[" +ADOObj.ChangeIntToStr(ItemActivate->iItem)
+"][" + ADOObj.ChangeIntToStr(ItemActivate->iSubItem) + "]";

DispEditExprText=DispEditExprText+FactorStr;
//将改变的文本设置回去
pEditExpression->SetWindowText(DispEditExprText);

////////将系数数据保存为可以计算的式子用
CString EditTextContent=this->GetItemText(ItemActivate->iItem,ItemActivate->iSubItem);

FactorStrToStr->Sign=FactorStr;
FactorStrToStr->Value=EditTextContent;


//保存系数数组到联表中
StrFactorList.AddTail(FactorStrToStr);

//包装为一个可以在CCalParamDlg内被访问的结构体
ReplaceArray->Factor=StrFactorList;



}
else
{
CEncapsulateADO ADOObj;
CString MStr="M[" +ADOObj.ChangeIntToStr(ItemActivate->iItem)
+"][" + ADOObj.ChangeIntToStr(ItemActivate->iSubItem) + "]";

DispEditExprText=DispEditExprText+MStr;
//将改变的文本设置回去
pEditExpression->SetWindowText(DispEditExprText);

////////将计算文本内容数据保存为可以计算的式子用
CString EditTextContent=this->GetItemText(ItemActivate->iItem,ItemActivate->iSubItem);

ContentStrToStr->Sign=MStr;
ContentStrToStr->Value=EditTextContent;

//保存表名
ReplaceArray->TableName=m_Tree_SelTable;

//保存内容数组到联表中
StrContentList.AddTail(ContentStrToStr);

//包装为一个可以在CCalParamDlg内被访问的结构体
ReplaceArray->MValue=StrContentList;

}

}

}


*pResult = 0;
}


我的问题是:由于MAPSTRTOSTR多次分配,我是否要利用循环来对此释放MAPSTRTOSTR内存?
-----
你申请的MAPSTRTOSTR最终必须释放掉,这个是无疑的。不然会造成内存泄漏,这样的程序是不合格的。
至于在什么地方,什么时候释放,这要看情况。
一般是在所记录的一个结构没有价值的时候,即你已经完成工作,这个时候就可以释放掉了。
对于你的说法,当然也可以,在所有的结构都使用完后,一次性释放掉。只是浪费内存而已(因为你不需要这个结构的时候,仍没有释放,而是在最后释放。),不会有问题。不过在一些对内存消耗过大的程序或是主机上需要运行多个程序时,这种浪费就很有问题了。


to yxz_lp()

我用了
typedef MAPSTRTOSTR* LPMAPSTRTOSTR;
很感谢指点.

 相关文章
·如此动态创建CEdit(在CWnd上),为什么显示是平坦的?没有BORDER?。。
·对ini文件的写入字符
·用C实现Ping程序
·怪事内存映射文件,没有FlushViewOfFile,也可以保存到文件?
·用tinyxml读取XML文件时,在读了一段数据后怎样继续读取第二段数据的头节点?
·串口程序

 推荐文章
求助--补全代码
如何知道一个线程还在“正常运行”
访问网络出现异常
如何将一个文件夹里的文件组织成xml描述信息
想将一些东东按拼音排序!!
求Debugging application 的sourcecode
vc开发的activex可以在网页中用吗?
请问什么时候需要为资源(例如对话框或按钮)新建一个类?
如何用SQL语言完成复杂字符串的筛选
有关DNS被屏蔽的问题?
MDI程序,如何像VC界面那样,编辑对话框时候在旁边显示标尺?
windows搜索驱动的默认路径是什么
 版权所有:IT问库
copyright © 2006 www.itwenku.cn all rights reserved.