关于释放指针引发的一个错误

*pVal = VARIANT_FALSE;

SAFE_BSTR_CS2C(sName)

if( (stmFile.vt^VT_ARRAY) <1 || (stmFile.vt^VT_ARRAY)>73)//用户传入数组类型不正确直接返回
return S_OK;
if( lcl_JudgeStreamIsNull(stmFile) )
return S_OK;
CString strPath;
HRESULT hr = lcl_TranslateStreamToTempFile(stmFile,strPath);
if(FAILED(hr)) return S_OK;

CString newPath = strPath.Left(strPath.GetLength() - 36) + CString(sName) + ".sot";

int len1 = WideCharToMultiByte( CP_ACP , 0 , strPath , strPath.GetLength() , NULL , 0 , NULL , NULL );
char* pAscii1 =new char[len1+1];
len1 = WideCharToMultiByte( CP_ACP , 0 , strPath , strPath.GetLength() , pAscii1 , len1 +1 , NULL ,NULL );
pAscii1[len1] = 0;

const char* p1 = (const char*)pAscii1;
delete [] pAscii1;//消除内存泄露

int len2 = WideCharToMultiByte( CP_ACP , 0 , newPath , newPath.GetLength() , NULL , 0 , NULL , NULL );
char* pAscii2 =new char[len2+1];
len2 = WideCharToMultiByte( CP_ACP , 0 , newPath , newPath.GetLength() , pAscii2 , len2 +1 , NULL ,NULL );
pAscii2[len2] = 0;

const char* p2 = (const char*)pAscii2;
delete [] pAscii2;//消除内存泄露
rename(p1,p2);//重命名辞典文件,命名为用户传入的名称,方便用户查询
//delete [] pAscii1;//消除内存泄露
//delete [] pAscii2;//消除内存泄露
CComPtr r_Model;
hr = lcl_GetModel(mpDispFrame,r_Model);
if(FAILED(hr)) return S_OK;

hr = ExecuteFunc(r_Model, L"ImportUsingDict", &CComVariant(newPath),1,NULL);//病历通专有方法
if( FAILED(hr)) return S_OK;

*pVal = VARIANT_TRUE;
return S_OK;
这段代码问题出在delete 字符指针的时候,由于两个指针指向同一块内存区域 const char* p1 = (const char*)pAscii1;当调用rename库函数的时候,其实p1,p2都指向一个不明的内存区域,里面内容都是烫烫烫,大家可能会比较熟悉这种错误,只要将释放资源的代码放在合适的位置即可,放到rename之后一起delete,这种错误只有调试后才可以发现,故写代码的时候一定要注意了。

另外今天解决一个始终用不了XElement的问题,因为要引入System.Xml.Linq,但是由于这个解决方案是由vs2005新建的,而现在用的是vs2008,于是项目属性中,编译,高级便宜选项采用的是.NET framework 2.0,这个不包含System.Xml.Linq,于是修改这个选项然后重新add refrence ,最后Imports System.Xml.Linq即可


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值