CString之GetBuffer与ReleaseBuffer
我们知道,CString是MFC中提供的方便字符串操作的一个类,非常好使,具有自动动态内存管理功能。
GetBuffer()主要作用是将字符串的缓冲区长度锁定;
ReleaseBuffer()则是解除对缓冲区的锁定,这样使得CString对象在以后的代码中继续可以实现长度自适应增长的功能。
GetBuffer()说白了就两个功能:
1:就是将CString里面的内存交到外部一个来处理,外部可以直接修改它的内容。
2:重新修改CString的内存大小,这个数值不包含null结尾符。
另一个典型的用法:就是将CString里面的内容变为int或long型,需要先获取里面的内存指针。这样就可以先GetBuffer(内存大小)方便直接转换。
如果在外部修改了CString里面的内容,在重新使用CString之前,需调用ReleaseBuffer()也就是说,ReleaseBuffer()不需要每次都调用。
CString::GetBuffer有两个重载版本:
LPTSTR GetBuffer( );
LPTSTR GetBuffer(int nMinBufferLength);
在第二个版本中,当设定的长度小于原字符串长度时,nMinBufLength = nOldLen,该参数会被忽略,不分配内存,指向原CString;当设定的长度大于原字符串本身的长度时就要重新分配(reallocate)一块比较大的空间出来。
而调用第一个版本时,应如通过传入0来调用第二个版本一样。
是否需要在GetBufer()后面调用ReleaseBuffer(),是根据你的后面的程序是否需要继续使用该字符串变量,并且是否动态改变其长度而定的。
如果你GetBuffer()以后程序自函数就退出,局部变量都不存在了,调用不调用ReleaseBuffer()没什么意义了。
GetBuffer(int size)是用来返回一个你所指定大小可写内存的成员方法。它和被重载的操作符LPCTSTR还是有点本质区别的,LPCTSTR是直接返回一个只读内存的指针,而GetBuffer则是返回一个可以供调用者写入的内存,并且,你可以给定大小。
下面是个简单的,但也是非常典型的例子:
int readFile(CString& str, const CString& strPathName)
{
FILE* fp = fopen(strPathName, "r");
fseek(fp, , SEEK_END);
int nLen = ftell(fp);
fseek(fp, , SEEK_SET);
char* psz = str.GetBuffer(nLen);
fread(psz, sizeof(char), nLen, fp);
str.ReleaseBuffer();
fclose(fp);
}
上面的函数是GetBuffer()函数最典型的用法了,其实它就相当于申请一块nLen大小的内存,只不过,这块内存是被引用在CString对象的内部而已,这是非常有效的一种用法,如果不直接用GetBuffer函数来申请的话,那么你必须用new操作符(或者malloc()函数)在CString的外部申请,然后再将申请的内存拷贝到CString对象中,显然这是一个非常冗余的操作,会使你函数的效率大大下降。
ReleaseBuffer()函数是用来告诉CString对象,你的GetBuffer()所引用的内存已经使用完毕,现在必须对它进行封口,否则 CString将不会知道它现在所包含的字符串的长度,所以在使用完GetBuffer()之后,必须立即调用ReleaseBuffer()函数重置CString的内部属性,其实也就是头部信息。
CString之GetBuffer与ReleaseBuffer的更多相关文章
- CString的GetBuffer和ReleaseBuffer
GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能. CString ::GetBu ...
- [转载]对于GetBuffer() 与 ReleaseBuffer() 的一些分析
先 转载一段别人的文章 CString类的这几个函数, 一直在用, 但总感觉理解的不够透彻, 不时还有用错的现象. 今天抽时间和Nico一起分析了一下, 算是拨开了云雾: GetBuffer和Rele ...
- CString的GetBuffer用法,GetBuffer本质,GetBuffer常见问题解决方法
一.函数原型 CString::GetBuffer LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryException ); Return V ...
- 对于GetBuffer() 与 ReleaseBuffer() 的一些分析
先 转载一段别人的文章 CString类的这几个函数, 一直在用, 但总感觉理解的不够透彻, 不时还实用错的现象. 今天抽时间和Nico一起分析了一下, 算是拨开了云雾: GetBuffer和Rele ...
- Cstring中GetBuffer()方法的主要作用
摘自:http://bbs.csdn.net/topics/310247836 GetBuffer()主要作用是将字符串的缓冲区长度锁定 CString::GetBuffer有两个重载版本: (1 ...
- GetBuffer与ReleaseBuffer的用法,CString剖析
转载: http://blog.pfan.cn/xman/43212.html GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象 ...
- CString转换为LPSTR和LPSTR转化为CString
一.CString转换为LPSTR 方法一: CString strFileName LPSTR lpstr - strFileName.GetBuffer(); strFileName.Releas ...
- CString转换为string
string CStringToString(CString strMFC) { CStringA strA; strA = strMFC.GetBuffer(); strMFC.ReleaseBuf ...
- VC++ CString类完美总结(整理)
CString 是编程中一种非常有用的数据类型,它是MFC中的一个类,很大程度上简化了MFC中的许多字符串的操作. CString位于头文件afx.h中. ①.CString 类对象的初始化: CSt ...
随机推荐
- c++模板
1.从 python 说起 def add(a, b): return a + b; print add(3.1, 5.1); #8.2 print add("abc", &quo ...
- 关于使用jacob出现的异常
1) 把jacob.jar加载到工程里:2) 把jacob.dll放入 JAVA_HOME\bin\ 和 JAVA_HOME\jre\bin目录下:3) 把jacob.dll放入 C:\WINDOW ...
- git 初始化
Git global setup git config --global user.name "杨清1" git config --global user.email " ...
- python 爬虫1
简单访问有道词典的翻译界面,将页面翻译功能简单呈现 import urllib.request import urllib.parse import json content = input(&quo ...
- FineUI第十五天---表格概述
Grid表格概述 跟Asp.Net的差不多. 下面介绍一些属性: ExpandUnusedSpace:此列充满所有的剩余空间,并且随着表格宽度变化而变化 DataToolTipField:用来显示 ...
- Unity3D在IOS上的优化小结
http://www.58player.com/blog-635-122.html 最近一段時間一直在做Unity 在IOS設備上的資源優化,結合Unity的官方文檔以及自己遇到的實際問題,我把自己認 ...
- 在Android工程中运行main函数
在main函数中右键 --> Run As --> Run Configurations.. Java Application中的类 --> Classpath --> Boo ...
- Oracle 多表查询优化
ORACLE有个高速缓冲的概念,这个高速缓冲就是存放执行过的SQL语句,那oracle在执行sql语句的时候要做很多工作,例如解析sql语句,估算索引利用率,绑定变量,读取数据块等等这些操作.假设高速 ...
- Linux之ls命令
s 命令可以说是linux下最常用的命令之一. -a 列出目录下的所有文件,包括以 . 开头的隐含文件.-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出.-c 输出文件 ...
- union联合体
今天笔试的一道题,好久没用union了,竟然忘光光了. 关于其大小的计算,分两步:先算对齐大小(成员中字节最大的那个),再算分配空间: 不仅是对齐大小的整数倍,还要满足实际大小不能小于最大成员大小. ...