CString CConLog::ReadConfig(CString section,CString key)
{
 GetPrivateProfileString(section,key,_T(""),m_sReadPath.GetBuffer(MAX_PATH),MAX_PATH,m_sIniPath);
 m_sReadPath.ReleaseBuffer();//不释放出错
 return m_sReadPath;
}

对于GetBuffer() 与 ReleaseBuffer() 的一些分析 收藏
先 转载一段别人的文章

CString类的这几个函数, 一直在用, 但总感觉理解的不够透彻, 不时还有用错的现象. 今天抽时间和Nico一起分析了一下, 算是拨开了云雾:
GetBuffer和ReleaseBuffer是一套需要配合使用的函数, 与GetBufferSetLength相比, 优点是如果分配的空间大于实际保存的字符串(0结尾), ReleaseBuffer会把多余申请的空间释放, 归还给系统; 但使用时需要注意以下问题: 如果要保存的字符串为abc(0结尾), 则GetBuffer参数应至少为3; 如果要保存的内容不是以0结尾, 比如是读取文件数据, 则GetBuffer参数如果大于文件长度时, ReleaseBuffer参数一定要为文件长度(如果GetBuffer参数为文件长度的话不存在问题, ReleaseBuffer参数可以为默认-1)!

CString csStr;
LPTSTR lpsz = csStr.GetBuffer(100);
lpsz[0] = 'a';
lpsz[1] = 'b';
lpsz[2] = '\0';
csStr.ReleaseBuffer();
int nLength = csStr.GetLength();

GetBufferSetLength相对比较容易理解, 它申请一个指定长度的空间, 即使里面最终保存的字符串长度小于申请的空间长度, 也不会将多余空间释放.

CString csStr;
LPTSTR lpsz = csStr.GetBufferSetLength(100);
lpsz[0] = 'a';
lpsz[1] = 'b';
lpsz[2] = '\0';
int nLength = csStr.GetLength();

对于红色部分,自己写代码时的确遇到过这样的问题:代码如下

  CString temp;
ULONGLONG dwcount = Input_File.GetLength();
//UINT dwcount = (UINT)Input_File.GetLength();
Input_File.Read(temp.GetBuffer(dwcount),dwcount);
temp.ReleaseBuffer(dwcount);

若temp.ReleaseBuffer()不指定参数,执行这一步是会遇到错误,所以,类似的文件读取操作,releasebuffer的时候还是指定一个与getbuffer一样的参数为好

另:对于

(如果GetBuffer参数为文件长度的话不存在问题, ReleaseBuffer参数可以为默认-1)!

我设置temp.ReleaseBuffer(-1);此句执行的时候仍然出现错误,故还是指定文件长度为好
接下来看看其他的代码

CString str;
BROWSEINFO bi;
TCHAR name[MAX_PATH];
ZeroMemory(&bi,sizeof(BROWSEINFO));
bi.hwndOwner = GetSafeHwnd();
bi.pszDisplayName = name;
bi.lpszTitle = _T("选择文件夹");
bi.ulFlags = BIF_RETURNFSANCESTORS;
LPITEMIDLIST idl = SHBrowseForFolder(&bi);
if(idl == NULL)
return;
SHGetPathFromIDList(idl, str.GetBuffer(MAX_PATH));
1
//CString aa = str.GetBuffer(MAX_PATH);
//CString bb = str;                         //运行此句之后,str内容变成乱码
//int a = aa.GetLength();
//int b = str.GetLength();
//LPTSTR cc = str.GetBuffer(MAX_PATH);
//LPTSTR dd = bb.GetBuffer(MAX_PATH);
//cc[1] = 'a';
//bb.ReleaseBuffer();
debug 参数如下图所示:
2
CString aa = str.GetBuffer(MAX_PATH);
int a = aa.GetLength();
int b = str.GetLength();                       //b无法获取str的长度
LPTSTR cc = str.GetBuffer(MAX_PATH);
cc[1] = 'a';
int e = str.GetLength();                       //e无法正确获取str的长度,与3不同之处在于此处的str在蓝色字体getbuffer后未releasebuffer                                  //妥善的做法是在两次str.getbuffer与str.GetLength()之间都都releasebuffer()下。
str.ReleaseBuffer();
int d = str.GetLength();
debug 参数如下所示:
3
//CString aa = str.GetBuffer(MAX_PATH);
//str.ReleaseBuffer();
//CString bb = str;                                  //bb的内容正确
//int a = aa.GetLength();
//int b = str.GetLength();
//LPTSTR cc = str.GetBuffer(MAX_PATH);
//LPTSTR dd = bb.GetBuffer(MAX_PATH);
//cc[1] = 'a';
//int d = str.GetLength();            //此处虽然可以正确获取str的值,但是在GetBuffer()后,最好还是在cc[1] = ‘a’ 后releasebuffer()一次。
//为何不再cc[1] = ‘a’前releasebuffer的原因:虽然此处str仍然会变成”Ca\…..”,但是根据MSDN:在调用ReleaseBuffer之后,由GetBuffer返回的地址也许就无效了,因为其它的CString操作可能会导致CString缓冲区被重新分配。如果你没有改变此CString的长度,则缓冲区不会被重新分配。妥当的做法是在cc[1]后releasebuffer
debug参数值如下所示:
4
str.ReleaseBuffer();                                //  对上面的SHGetPathFromIDList(idl, str.GetBuffer(MAX_PATH));  进行的释放操作
CString aa = str.GetBuffer(MAX_PATH);
CString bb = str;                                   // 执行完此句后,str的值不会变成乱码,和1类比
int f = str.GetLength();                            //和1比,此处可以正确获取长度
str.ReleaseBuffer();
int a = aa.GetLength();
int b = str.GetLength();
CString ff = str.GetBuffer(MAX_PATH);
LPTSTR dd = bb.GetBuffer(MAX_PATH);
int d = str.GetLength();

对于一个CString 进行GetBuffer后,在进行该CString 的其他 CString 函数操作(尤其是 “=” “+” 等容易忽视的 CString 操作)前ReleaseBuffer(虽然从此处的几段代码执行情况来看,表面上在GetBuffer后在一次执行 CString操作不会导致错误,但是进行第二次CString 操作时就会产生错误。为了安全起见,getbuffer后需要在次执行CString的函数操作,先ReleaseBuffer()).

http://blog.sina.com.cn/s/blog_82c346de0100trga.html

GetBuffer--ReleaseBuffer问题相关推荐

  1. Getbuffer ReleaseBuffer Cstring

    getbuffer是为了让你使用CString类中,保存字符串缓冲区的那块指针.     至于releasebuffer,在MSDN中有这样一句话.     If   you   use   the ...

  2. MFC CString的GetBuffer()/ReleaseBuffer()

    CString GetBuffer()/ReleaseBuffer()两个方法的使用 LPTSTR GetBuffer(int nMinBufLength); void ReleaseBuffer(i ...

  3. GetBuffer, ReleaseBuffer, GetBufferSetLength的用法

    GetBuffer和ReleaseBuffer是一套需要配合使用的函数, 与GetBufferSetLength相比, 优点是如果分配的空间大于实际保存的字符串(0结尾), ReleaseBuffer ...

  4. 精解CString类的GetBuffer,ReleaseBuffer 函数(VC++)

    CString的GetBuffer用法 一.函数原型 CString::GetBuffer LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryE ...

  5. 分析: GetBuffer, ReleaseBuffer, GetBufferSetLength

    GetBuffer和ReleaseBuffer是一套需要配合使用的函数, 与GetBufferSetLength相比, 优点是如果分配的空间大于实际保存的字符串(0结尾), ReleaseBuffer ...

  6. MFC CString GetBuffer/ReleaseBuffer 的使用条件

    今天为了通过串口往单片机里写一个16进制字符去控制单片机的adc的起停,结果糊涂到把'\x01'误写成'\0x01',怎么也得不到意想的结果,程序员有时候会犯低级错误,有时候怎么也跳不出去,这时候通过 ...

  7. MFC CString GetBuffer ReleaseBuffer方法

    一.函数原型 CString::GetBuffer LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryException ); Return V ...

  8. CString Management (关于CString的所有操作)

    CString Management (关于CString的所有操作) 作者:FreeEIM CStrings are a useful data type. They greatly simplif ...

  9. [转]wchar_t char std::string std::wstring CString 转换

    [转]wchar_t char std::string std::wstring CString 转换 1 #include <string> 2 // 使用CString必须使用MFC, ...

  10. CString之GetBuffer、ReleaseBuffer

    LPTSTR GetBuffer( int nMinBufLength ); nMinBufLength为buffer的字符长度,不包括结束符 返回CString对象的内部buffer指针,非cons ...

最新文章

  1. unity获取脚本组件_Unity3D【脚本】获取游戏物体的Animator组件,并且修改动画属性 | 学步园...
  2. PowerDesigner使用方法入门学习
  3. java插入flash_怎样可以把flash添加到Java应用程序
  4. shell脚本安装mysql并安装一个小服务
  5. shell生成随机文件名
  6. 机械设计电子版_非标机械设计有哪些设计过程??
  7. Python 数据结构与算法——选择排序(迭代版、递归版)
  8. Query 中使用 text() 或者 html() 函数可bai以获取font or td 的内容:
  9. 敏捷软件开发VS传统软件开发
  10. [USACO 2009 Dec G]Video Game Troubles-----分组背包的改良版
  11. SpringBoot整合Flyway
  12. (七)DKN:用于新闻推荐的深度知识感知网络
  13. 达梦数据库LENGTH_IN_CHAR(对象的长度是否以字符为单位)总结
  14. DeepLink的实现原理
  15. 太美医疗科技CTMS临床试验项目管理系统的全新升级
  16. Nginx性能调优,解决C10K问题
  17. 潘多拉盒子 使用 hd-idle 硬盘休眠设置
  18. linux代码之LL/SC/LSE 及锁指令
  19. ERP是什么?中小商户有必要用吗?秦丝、金蝶、管家婆哪家强?
  20. 【转载】trash-cli使用说明

热门文章

  1. 腾讯广点通开屏广告错误码
  2. rpc远程过程调用_什么是远程过程调用(RPC)?
  3. simulink飞轮储能永磁风机PMSG和同步机一次调频。
  4. Java运行时异常和非运行时异常
  5. Kafka集群部署与测试
  6. 首席新媒体运营胡耀文教程:关于抖音代运营的简单介绍
  7. ABBYY Recognition Server助力韩国国会图书馆实现数字化
  8. 浏览器提示代理服务器拒绝连接怎么处理
  9. 高德定位(后续开发)
  10. 网页基本布局流程(上半部分)