Getbuffer ReleaseBuffer Cstring
getbuffer是为了让你使用CString类中,保存字符串缓冲区的那块指针.
至于releasebuffer,在MSDN中有这样一句话.
If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions.
在对GetBuffer返回的指针使用之后需要调用ReleaseBuffer,这样才能使用其他Cstring的operations。否则会发生错误.
首先举个例子。CString s( "abcd" );
int len=s.GetLength();
LPTSTR p = s.GetBuffer( );
strcpy( p, "Hello" );
这是 GetBuffer 的第一种用法,也是最简单的一种,不用给它传递参数,它使用默认值 0,意思是:“给我这个字符串的指针,我保证不加长它”。当你调用 ReleaseBuffer 时,字符串的实际长度会被重新计算,然后存入 CString 对象中。
如果你需要修改 CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。
如果仅仅是读出CString中的内容,那么只需要用GetBuffer(0)即可。如果后面对CString还有其他操作,那么立刻ReleaseBuffer。
其他:
GetBuffer() 他会create出所指定大小的空间出来 这个空间是可以让我们修改的
很多时候 有的 API 会要一个(char*)的指标作为输出
如果我们就因为这样去产生一个(char*)的buffer 给他 等到资料取出来之後
便无法使用CString 的种种方便功能
因此 比较好的做法 便是用GetBuffer()来产生一个buffer空间给他
等到取出来之後 我们便可以直接使用CString来对他操作
GetBuffer() 使用完後 最好是呼叫一下ReleaseBuffer()做为结束
虽然小弟的网志之前已经有很多GetBuffer()的使用了 不过还是附个范例
CFile file;
// FILE_NAME 为事先定义好的档案名称
if(file.Open(FILE_NAME,CFile::modeRead))
{
CString szContent;
int nFileLength = file.GetLength();
file.Read(szContent.GetBuffer(nFileLength),nFileLength);
szContent.ReleaseBuffer();
// 取得档案内容放在szContent中 我们之後可以对其操作
}
关于GetBuffer/ReleaseBuffer,网上比较流行的一种说法是:如果你要直接修改CString的内部数据,就要调用GetBuffer/ReleaseBuffer.我也同意这样的表述.
下面是几个例子,主要是错误的例子,来加深理解.
1
char * p = strTest.GetBuffer( 0 );
int i = atoi(p);
strTest.ReleaseBuffer();
这种用法当然没有错,但是我认为这里的GetBuffer/ReleaseBuffer是没有必要的 ,为什么呢?因为
int __cdecl atoi(const char *) 的参数是const char*,CString的内部数据肯定不会被修改的 .
所以上面的代码可以直接写成
int i = atoi((LPCTSTR)strTest);
顺便说一下GetBuffer的参数问题,网上的例子中,很多都是GetBuffer(5) GetBuffer(10)这样的常数,实际中的程序不可能是这么容易事先知道的,所以也就有了 strTest.GetBuffer(strTest.GetLength() )的写法.其实,GetBuffer(0)就可以了.可以由GetBuffer的源码得到验证.
2
// some other code
CString strTest2 = strTest;//之后两个cstring内容仍然存于同一内存位置
char seps[] = " " ;
char * pToken = 0 ;
// char* pStr = strTest2.GetBuffer(0);
pToken = strtok(( char * )(LPCTSTR)strTest2, seps);
//pToken = strtok(pStr , seps);
while (pToken)
pToken = strtok(NULL, seps);
//strTest2.ReleaseBuffer(0);
CString 类里面有专门的结构体来记录这些信息
struct CStringData
{
long nRefs; // reference count 引用计数
int nDataLength; // length of data (including terminator) 数据长度
int nAllocLength; // length of allocation 内存分配长度
// TCHAR data[nAllocLength]
TCHAR* data() // TCHAR* to managed data
{ return (TCHAR*)(this+1); }
};
赋值的时候只是简单的把引用计数加1, nRefs++,然后指向同一内存单元
每一个对象销毁时,先把引用计数减1, nRefs--,然后判断是否为0,如果为0才真正释放
运行上面的代码,可以看到strTest的值也变了,呵呵,这就是程序中一些关与CString的奇怪问题的起源.如果用注释中的GetBuffer/ReleaseBuffer方法,就一点问题也没有了.
同样,对于ReleaseBuffer的参数,缺省的是-1,但是我不建议.因为-1表示使用当前的00结束符位置来确定新的长度.而上面的例子中,strtok是会重新设置00结束符的,所以,安全的做法,就是把这个CString的长度设为0,ReleaseBuffer(0),反正它的内容已经变了,也没有人要用了.
说明一下,GetBuffer/ReleaseBuffer方法只能保证strTest不变,strTest2还是会变的.所以,对于一个成员变量,比如m_strTest2调用ReleaseBuffer要多一个心眼,局部变量就不用想这么多了.
那么怎么从最开始就意识到程序写错了呢?上面代码中(char * )(LPCTSTR)是很危险的,把const去掉了,否则strtok是编译不过的,也从一个侧面说明了const的重要性.
文章转自:http://www.cnblogs.com/dongzhiquan/archive/2009/08/03/1994766.html
Getbuffer ReleaseBuffer Cstring相关推荐
- 精解CString类的GetBuffer,ReleaseBuffer 函数(VC++)
CString的GetBuffer用法 一.函数原型 CString::GetBuffer LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryE ...
- MFC CString的GetBuffer()/ReleaseBuffer()
CString GetBuffer()/ReleaseBuffer()两个方法的使用 LPTSTR GetBuffer(int nMinBufLength); void ReleaseBuffer(i ...
- MFC CString GetBuffer/ReleaseBuffer 的使用条件
今天为了通过串口往单片机里写一个16进制字符去控制单片机的adc的起停,结果糊涂到把'\x01'误写成'\0x01',怎么也得不到意想的结果,程序员有时候会犯低级错误,有时候怎么也跳不出去,这时候通过 ...
- MFC CString GetBuffer ReleaseBuffer方法
一.函数原型 CString::GetBuffer LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryException ); Return V ...
- GetBuffer, ReleaseBuffer, GetBufferSetLength的用法
GetBuffer和ReleaseBuffer是一套需要配合使用的函数, 与GetBufferSetLength相比, 优点是如果分配的空间大于实际保存的字符串(0结尾), ReleaseBuffer ...
- 分析: GetBuffer, ReleaseBuffer, GetBufferSetLength
GetBuffer和ReleaseBuffer是一套需要配合使用的函数, 与GetBufferSetLength相比, 优点是如果分配的空间大于实际保存的字符串(0结尾), ReleaseBuffer ...
- CString的GetBuffer与ReleaseBuffer
http://blog.pfan.cn/xman/43212.html http://www.cnblogs.com/jamesmile/archive/2010/04/19/1715756.html ...
- CString:Getbuffer和Releasebuffer的作用
首先看MSDN中的解释: CString::GetBuffer LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryException ) ...
- CString 中Releasebuffer GetBuffer 相关实现原理
一.函数原型 CString::GetBuffer LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryException ); Return V ...
最新文章
- 《java编程思想》读后笔记:二,吸血鬼数字
- oracle 10 升级补丁
- 奥巴马女儿要上哈佛了!从小给女儿定下了五条规矩! 2017-08-07 07:35 哈佛/美国 转载授权请回复“转载“ 文:益美传媒|编辑:Angela 奥巴马曾说自己最骄傲的一件事,就是即使在长
- 浅谈MyBatis一级缓存
- mysql区分大小写搜索
- free -m 下的含义
- C#.Net工作笔记007---关于Lst深层复制_浅层复制_提供一个方法可以直接使用
- 2022.7台式机装机指南(3060 + 12490F)
- 比尔·盖茨买百万亩农地成美“头号地主”,图扑数字孪生农场
- 2.5 Moblin项目提供的开发工具
- matlab——红绿灯颜色及数字识别(三)
- Java面试题---第四阶段
- 苹果发通谍拒绝“热更新”,中国程序猿“最受伤”
- 基于R语言的主成分和因子分析
- 阿里达摩院出手抗疫:AI算法加持,疑似病例基因分析缩短至半小时
- docker的基本使用方法
- 鸿蒙hilink的关系,华为继续应用鸿蒙OS助力智能生活 HiLink生态用户超过5000万
- 越狱Season 1-Episode 5: English, Fitz or Percy
- 微软2016校园招聘在线笔试 B Professor Q's Software [ 拓扑图dp ]
- PCIe系列专题之七:PCIe热插拔