先 转载一段别人的文章

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();

/* n的值为2 */

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

LPTSTR lpsz = csStr.GetBufferSetLength(100);

lpsz[0] = 'a';

lpsz[1] = 'b';

lpsz[2] = '/0';

int nLength = csStr.GetLength();

/* n的值还是为100 */

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

  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 函数操作(尤其是 “=” “+” 等easy忽视的 CString 操作)前ReleaseBuffer(尽管从此处的几段代码运行情况来看,表面上在GetBuffer后在一次运行 CString操作不会导致错误,可是进行第二次CString 操作时就会产生错误。为了安全起见,getbuffer后须要在次运行CString的函数操作,先ReleaseBuffer()).

对于GetBuffer() 与 ReleaseBuffer() 的一些分析的更多相关文章

  1. [转载]对于GetBuffer() 与 ReleaseBuffer() 的一些分析

    先 转载一段别人的文章 CString类的这几个函数, 一直在用, 但总感觉理解的不够透彻, 不时还有用错的现象. 今天抽时间和Nico一起分析了一下, 算是拨开了云雾: GetBuffer和Rele ...

  2. CString之GetBuffer与ReleaseBuffer

    我们知道,CString是MFC中提供的方便字符串操作的一个类,非常好使,具有自动动态内存管理功能. GetBuffer()主要作用是将字符串的缓冲区长度锁定: ReleaseBuffer()则是解除 ...

  3. GetBuffer与ReleaseBuffer的用法,CString剖析

    转载: http://blog.pfan.cn/xman/43212.html GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象 ...

  4. CString的GetBuffer和ReleaseBuffer

    GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能. CString ::GetBu ...

  5. CString的GetBuffer用法,GetBuffer本质,GetBuffer常见问题解决方法

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

  6. Cstring中GetBuffer()方法的主要作用

    摘自:http://bbs.csdn.net/topics/310247836 GetBuffer()主要作用是将字符串的缓冲区长度锁定   CString::GetBuffer有两个重载版本: (1 ...

  7. C++11-新增正则表达式

    #include <regex> #include <iostream> #include <string> #include <atlstr.h> s ...

  8. MFC学习笔记2---简单计算器

    前言 学习了鸡啄米网页的前三部分后,我们就可以做一个小软件出来了,我选择先做一个计算器. 这是Win7系统自带的计算器: 为了提升成就感,我将计算器的大部分内容去除,于是就变成这样: 这样就只剩下了1 ...

  9. CString转换为LPSTR和LPSTR转化为CString

    一.CString转换为LPSTR 方法一: CString strFileName LPSTR lpstr - strFileName.GetBuffer(); strFileName.Releas ...

随机推荐

  1. 网页显示UIWebView(一个)

    1.scalesPageToFit设置为YES,这样web页面会依据屏幕大小进行自己主动缩放. 2.UIWebView的状态监视 //内容读入開始前被调用.将UIWebView,返回no后UIWebV ...

  2. Struts2 + uploadify 多文件上传完整的例子!

    首先,我这里使用的是  Jquery  Uploadify3.2版本号  导入相关的CSS  JS    <link rel="stylesheet" type=" ...

  3. jedis异常:NoSuchElementException: Timeout waiting for idle object

    项目发现网络环境:java.util.NoSuchElementException: Timeout waiting for idle object 问题原因:不应该在try中释放资源.而应该在fin ...

  4. OpenWRT GPIO人口控制 WLED

    Linux根据系统GPIO系统架构简介 关于这个GPIO我一直认为非常非常长的时间easy.但.当你需要给一个特定的系统,参与这些GPIO什么时候.你会找到.不对,实例,mt7620n. GPIO#7 ...

  5. 编程获取linuxservercpu、内存和磁盘使用

    proc文件系统简介 /proc文件系统是一个伪文件系统.它是唯一的,其中存储器,如果不采取外部存储空间. 它是文件系统提供了与内核进程进行通信的接口的方法.用程序能够通过/proc得到系统的信息.并 ...

  6. IIS7.0 Appcmd 命令详解

    原文 IIS7.0 Appcmd 命令详解 一:准备工作 APPcmd.exe 位于 C:\Windows\System32\inetsrv 目录 使用 Cd c:\Windows\System32\ ...

  7. 我异常-VS2012“System.AccessViolationException: 试图读取或写入保护内存。”

       我的系统是win7 64位 系统 安装的是 Visual studio 2012.从SVN上下载了源代码.一个B/S的系统.能正常载入登陆页,但在输入登录信息要登录的时候,就报错了:     - ...

  8. C#从SQL server数据库中读取l图片和存入图片

    原文:C#从SQL server数据库中读取l图片和存入图片 本实例主要介绍如何将图片存入数据库.将图片存入数据库,首先要在数据库中建立一张表,将存储图片的字段类型设为Image类型,用FileStr ...

  9. 设计模式之享元模式(Flyweight)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  10. SRM 587 Div II L3:ThreeColorabilityEasyy

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12699 这道题目是第一次在比赛的时候做出来的,开始还想用bru ...