CString的GetBuffer

CString str = “abcde/0cde”;
输出字符串的值为: abcde

而字符串的长度为 s.GetLength() 的值为: 5

这是因为CString对象在赋值时只察看到’/0’,后面的疏忽了, 也即便说切实对象str内容为"abcde".

而str恳挚的存储空间为6(字符串以’/0’结尾).

因而说在字符长度和切实的空间是不一样的. 好!别跑!

请看下面有趣的过程:

CString str = “hello”;

LPSTR pf = (LPSTR)(LPCSTR)s;

LPSTR pa = s.GetBuffer(0);

你能够测得 pf == pa;

LPSTR pb = s.GetBuffer(10);

你能够测得 pf != pb;

为什么:

我们都懂得(LPSTR)(LPCSTR)s 切实指向对象str的切实字符串的内存地址,iphone5 GetBuffer() 函数中的参数(其实即便重新申请的字符串的长度)万一小于等于过去的字符串长度, 则不会重新分配内存利用本来的内存因而 pf == pa, 万一大于过去的字符串长度, 则重新追加内存(也即便要复制本来的内容),

因而pf != pb.

当心GetBuffer()函数中的参数为重新申请的字符串的长度, 切实内存的大小应再加1.

CString s = “hello”;

LPSTR pf = s.GetBuffer(0);

strcpy(pf,“hi”);

这时对象str 的内容为 “hi”

然而s.GetLength()的值为5, 万一加上一条语句:

s.ReleaseBuffer();

则s.GetLength()的值为2

解释:
CString对象在内存管用一个计数器来坚持可用缓冲区的大小

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

很显明ReleaseBuffer的作用即便更新字符串的长度。 CString内,GetLength获得字符串长度并不是动态计算的,而是在赋值垄断后计算并保留在一个int变量内的,当穿越GetBuffer直接修正CString时,那个int变量并不可能积极更新,于是便有了ReleaseBuffer.

CString s = “hello”;

LPSTR pf = s.GetBuffer(0);

strcpy(pf,“hi”);

LPSTR ps = (LPSTR)(LPCSTR)s; 字符串缓冲区的首地址

*(ps+2) = ‘x’;

则字符串的切实内容为: “hixlo”

*(ps+6) = ‘a’; 出错, 因为对象s的切实空间为 6

CString s = “hello”;

LPSTR pf = s.GetBuffer(10);

strcpy(pf,“hi”);

LPSTR ps = (LPSTR)(LPCSTR)s; 字符串缓冲区的首地址

*(ps+2) = ‘x’;

*(ps+5)= ‘/0’;

则字符串的切实内容还是为: “hixlo”

*(ps+6) = ‘a’; 能够因为s对象的切实空间为11

说白了 ReleaseBuffer即便更新赋值尔后的字符串的长度, 而切实空间未曾大约的改变, GetBuffer才是使内存空间大小改变的始作俑者.

有乐趣的能够测验一下就懂得了!!!

本文来自CSDN博客,请标明出处:http://blog.csdn.net/shyboy_NWPU/archive/2009/07/16/4352602.aspx从分寸上来讲,人们都该当对此拍手称快。

发布了78 篇原创文章 · 获赞 16 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/zeqi1991/article/details/96322827
今日推荐