人较笨且记性不好,故记录在此.折叠代码打不开请F5.本博中很多是转载收录其他网友的文章(原文地址请见博文末尾),所有权为原作者所有!!!
此博客已不再更新和维护,欢迎关注我的github新博客

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::

首先看MSDN中的解释:

CString::GetBuffer
LPTSTR GetBuffer( int nMinBufLength );
  throw( CMemoryException );
返回值:一个指向对象的(以空字符结尾的)字符缓冲区的LPTSTR指针
参数:nMinBufLength  字符缓冲区的以字符数表示的最小容量。这个值不包括一个结尾的空字符的空间

说明:
此成员函数返回一个指向CString对象的内部字符缓冲区的指针。返回的LPTSTR不是const,因此可以允许直接修改CString的内容
如果你使用由GetBuffer返回的指针来改变字符串的内容,你必须在使用其它的CString成员函数之前调用ReleaseBuffer函数。
在调用ReleaseBuffer之后,由GetBuffer返回的地址也许就无效了,因为其它的CString操作可能会导致CString缓冲区被重新分配。
如果你没有改变此CString的长度,则缓冲区不会被重新分配。
当此CString对象被销毁时,其缓冲区内存将被自动释放。
注意:如果你自己知道字符串的长度,则你不应该添加结尾的空字符。但是,当你用ReleaseBuffer来释放该缓冲区时,你必须指定最后的字符串长度。如果你添加了结尾的空字符,你应该给ReleaseBuffer的长度参数传递-1,ReleaseBuffer将对该缓冲区执行strlen来确定它的长度。

CString对象在内存中用一个计数器来维持可用缓冲区的大小

void ReleaseBuffer( int nNewLength = -1 ) 
{
if( nNewLength == -1 )
{
nNewLength = StringLength( m_pszData );
}
SetLength( nNewLength );
}

很明显ReleaseBuffer的作用就是更新字符串的长度。 CString内,GetLength获取字符串长度并不是动态计算的,而是在赋值操作后计算并保存在一个int变量内的,当通过GetBuffer直接修改CString时,那个int变量并不可能自动更新,于是便有了ReleaseBuffer.

示例:下面的例子说明了如何用CString::GetBuffer和CString::ReleaseBuffer(最好逐步调试观察值和地址的变化)

View Code
#include <stdio.h>
#include <afxwin.h>

void main(void)
{
CString s("abcd");

int i = s.GetLength();
printf("%s\n", s);
printf("s length1 is %d\n", i);

LPTSTR p = s.GetBuffer(6);
strcpy( p, "12345");
printf("%s\n", s);
int j = s.GetLength();
printf("s length2 is %d\n", j);

s.ReleaseBuffer();
printf("%s\n", s);
int k = s.GetLength();
printf("s length3 is %d\n", k);

strcpy( p, "a1b2c3"); // 这里新指定的字串若为"a1b2c3e"则会在此中断
printf("%s\n", s);
int m = s.GetLength();
printf("s length4 is %d\n", m);
}

运行结果为:

注意: 

1、CString对象内部的最后保留了'\0'字符,但是必须通过Getbuffer返回其指针后访问它才不会发生异常,如果用GetAt(GetLength())访问就会发生异常.
2、GetBuffer函数与GetbufferSetLength中的参数如果大于字符串的实际长度,则自动开辟新增加的长度。当调用ReleaseBuf函数后,则新增加的缓冲区如果未被存放内容那么多于的内存就会被释放。如果参数小于字符串的实际长度,并且大于等于0,则利用返回的指针访问不会发生异常,并且如果未做任何修改操作,那么当调用ReleaseBuf函数后,还是保持原来的字符串内容部变。如果小于0则会发生异常。
3、通过指针p和字符串s 实行字符串动态增加的效果是完全不一样的,因为字符串s里有很多成员函数为之服务。 

【参考资料 感谢作者】
http://blog.163.com/tufanghui01@126/blog/static/946064142010101182915651/
http://blog.sciencenet.cn/home.php?
mod=space&uid=481152&do=blog&id=427173
http://www.kaifa6.com/v/mfcshouce/class/CString_GetBuffer.htm

posted on 2011-06-17 22:51  子坞  阅读(4613)  评论(0编辑  收藏  举报