| 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; 很感谢指点.
|
|
 |
推荐文章 |
|