CString GetBuffer() and ReleaseBuffer()

2023-12-13 20:58

本文主要是介绍CString GetBuffer() and ReleaseBuffer(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CString GetBuffer() and ReleaseBuffer()
2009-05-12 16:32

原文地址:http://hi.baidu.com/winnyang/blog/item/067b0a5423805f173b293508.html

LPTSTR GetBuffer( int nMinBufLength ) 这个函数是CString 的一个比较实用的函数,请看如下示例:

GetBuffer(int nMinBufLength);的参数问题一直比较困扰人,网站的资料还像也不是太好给的,请看msdn解释

Parameters
nMinBufLength
The minimum size of the character buffer in characters. This value does not include space for a null terminator.
得到buffer的最小长度,当然这是由我们自己设定的一个参数,其原型定义如下:
LPTSTR CString::GetBuffer(int nMinBufLength)
{
ASSERT(nMinBufLength >= 0);

if (GetData()->nRefs > 1 || nMinBufLength > GetData()->nAllocLength)
{
#ifdef _DEBUG
   // give a warning in case locked string becomes unlocked
   if (GetData() != _afxDataNil && GetData()->nRefs < 0)
    TRACE0("Warning: GetBuffer on locked CString creates unlocked CString!/n");
#endif
   // we have to grow the buffer
   CStringData* pOldData = GetData();
   int nOldLen = GetData()->nDataLength;   // AllocBuffer will tromp it
   if (nMinBufLength < nOldLen)
    nMinBufLength = nOldLen;
   AllocBuffer(nMinBufLength);
   memcpy(m_pchData, pOldData->data(), (nOldLen+1)*sizeof(TCHAR));
   GetData()->nDataLength = nOldLen;
   CString::Release(pOldData);
}
ASSERT(GetData()->nRefs <= 1);

// return a pointer to the character storage for this string
ASSERT(m_pchData != NULL);
return m_pchData;
}

上面的代码已经比较清楚了,当设定的长度小于原字符串长度时,nMinBufLength = nOldLen,然后分配相应的内存,当你设定的长度大于原字符串本身的长度时就要分配一块比较大的空间出来,这时你可以实现字符串对接的操作,请看如下一段代码:

CString s;
s
= " abc "
;
char * p = s.GetBuffer( 6
);
  
int l =
s.GetLength();
memcpy(p
+ l, " 111 " , 3
);
char * c = new char [ 6
];
memset(c,
' 1 ' , 3
);
char * d = " sss "
;
strcat(c,d);
CString e;
e
=
(LPCTSTR)c;
AfxMessageBox(e);
AfxMessageBox(s);

s.ReleaseBuffer();  
// Surplus memory released, p is now invalid.



这段代码主要是考察GetBuffer()函数的动作,在char* p=s.GetBuffer(6),通过debug 可以看到p[6]='',这说明他自动加上了一个结束符,如果你分配空间为5这时将发生指针越界的现象,再次印证了原函数的动作。

 

CString a( " hello world " );
char * b = a.GetBuffer( 0
);
strcpy(b,
" guanchanghui "
);
a.ReleaseBuffer();

这篇关于CString GetBuffer() and ReleaseBuffer()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/489926

相关文章

CString类的用法以及例子

1.LockBuffer()与 UnlockBuffer()的用法。 帮助你保护数据时调用。当你调用LockBuffer时,你就创建了一个字符串的一个拷贝,然后将引用计数设置为-1,这就“加锁”了该缓冲区。当缓冲区被加锁时,就没有其它的字符串可以引用该字符串中的数据,被加锁的字符串也不能引用其它字符串的数据。通过加锁该缓冲区内的字符串,就可以保证该字符串对数据的持续独占。当你使用完数据后,调用U

CString、String(标准模版…

原文地址:CString、String(标准模版库)、string(C语言)区别和联系----1---5 作者:蓝色的思念 STring与CSTring的区别和联系 CString:MFC里面封装的类。主要应用在MFC和ATL程中          主要数据类型有char(应用于ANSI),wchar_t(unicode),TCHAR(ANSI与unicode均可);

将double转成Cstring时 保留2个有效位

int a = 2.0; Cstring str; str.format("%.slf",a);

1_CString char* string之间的关系

CString转char*,string string转char*,CString char* 转CString,string 一、CString转char*,string //字串转换测试 CString CString1; std::string string1; CHAR* char1=NULL; //1string1=CString1.GetBuffer();CStri

GetBuffer

这个函数是为一个CString对象重新获取其内部字符缓冲区的指针,返回的LPTSTR为非const的,从而允许直接修改CString中的内容。 如果nMinBufLength(最小占用长度) 比当前buffer长度大,那么就调用GetBuffer函数去释放当前的Buffer,用一个被请求的大小去覆盖这个buffer并且重新设定计数器为0,如果在这之前你在这个buffer中调用了LockBuffer

CString的一些简单介绍

CString位于头文件afx.h中。 CString可以很方便的连接两个字符,可以进行如下操作: CString Hello("hello");CString World("world");CString HelloWorld=Hello+World;// HelloWorld valus is ''helloworld"    这些操作是通过运算符重载实现的。 CStri

CString.Format处理longlong数据类型

CString curT="20171204105200",str; long long val=_tstoi64(curT); str.Format("%I64d",val);

CString LPCTSTR区别联系

CString LPCTSTR区别联系  CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。 CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。 typedef OLECHAR FAR* BSTR; typedef const ch

CString/string/char *比较详解

关键点:<CStirng>主要用于MFC的编写,而<string>属于STL,两者都是符合标准C++的,但是在非windows平台或者说VC上还是用<string>吧。另外还有一个<string.h>这是传统C++才有的~ (一) 概述 string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中; CString(type

CString比较相等不得不说的故事

先说说今天的情况,扫码后把码值与自己写好的几百种配置文件进行比对,两个都是CString类型,但是不论是“==”,还是“ cstr1.Compare(cstr2)==0”,还是“cstr1.CompareNoCase(cstr2)==0”,结果都不行,开始还以为是什么问题,后来自己设置断点观察了一下,仔细看才发现在配置文件读出来的字符串有的后边还有个空格(空字符),我擦,然后就用”cstr1.Re