ReleaseBuffer函数是用来告诉CString对象,你的GetBuffer所引用的内存已经使用完毕,现在必须对它进行封口,否则 CString将不会知道它现在所包含的字符串的长度,所以在使用完GetBuffer之后,必须立即调用ReleaseBuffer函数重置 CString的内部属性,其实也就是头部信息。 补充一下: GetBuffer说白了就两个功能: 1:就是将CString里面...
LPTSTR GetBuffer(int nMinBufLength ); nMinBufLength为buffer的字符长度,不包括结束符 返回CString对象的内部buffer指针,非const,可以修改CString内容 void ReleaseBuffer( int nNewLength = -1 ); nNewLength为新的字符串长度,-1表示维持当前字符串长度 释放多余内存 注意点: 调用CString的任何其他member function之前...
能不能在ReleaseBuffer()之前通过字符串赋值放大字符串缓冲,我是以vc2010重新测试得出的结论,在其他开发环境未测试。 不过还是认为,ReleaseBuffer()之前直接操作CString字符串对象虽然没有错误,但不合适,因为字符串已经通过GetBuffer()把控制权已经给出去,再去干涉内部缓冲区,明显忘记了调用GetBuffer()的目的和意义。 3、...
s.ReleaseBuffer(); // Surplus memory released, p is now invalid. 这段代码主要是考察GetBuffer()函数的动作,在char* p=s.GetBuffer(6),通过debug 可以看到p[6]='',这说明他自动加上了一个结束符,如果你分配空间为5这时将发生指针越界的现象,再次印证了原函数的动作。 CString a("hello world"); char...
精解CString类的GetBuffer,ReleaseBuffer 精解CString类的GetBuffer,ReleaseBuffer 函数 (VC++)(转)CString str = "abcde/0cde";输出字符串的值为: abcde ⽽字符串的长度为 s.GetLength() 的值为: 5 这是因为CString对象在赋值时只检查到'/0',后⾯的忽略了, 也就是说实际对象str内容为"abcde".⽽str...
strTest.ReleaseBuffer(); 这种用法当然没有错,但是我认为这里的GetBuffer/ReleaseBuffer是没有必要的,为什么呢?因为 int __cdecl atoi(const char *)的参数是const char*,CString的内部数据肯定不会被修改的. 所以上面的代码可以直接写成 CString strTest="123"; ...
str.ReleaseBuffer();//千万不能缺少 fclose(fp); } 上面的函数是GetBuffer函数最典型的用法了,其实它就相当于申请一块nLen大小的内存,只不过,这块内存是被引用在CString对象的内部而已,这是非常有效的一种用法,如果不直接用GetBuffer函数来申请的话,那么你必须用new操作符(或者malloc()函数)在CString的外部申请,然...
void CString::ReleaseBuffer(int nNewLength){ CopyBeforeWrite(); // just in case GetBuffer was not called if (nNewLength == -1)nNewLength = lstrlen(m_pchData); // zero terminated ASSERT(nNewLength <= GetData()->nAllocLength);GetData()->nDataLength = nNewLength;m_pchData[n...
同时ReleaseBuffer还有一个很重要的作用,就是“ GetData()->nDataLength = nNewLength;” CString对象在内存中用一个计数器来维持可用缓冲区的大小 ReleaseBuffer的作用就是更新字符串的长度。 CString内,GetLength获取字符串长度并不是动态计算的,而是在赋值操作后计算并保存在一个int变量内的,当通过GetBuffer直接修改CSt...
Copyright © Yisu Cloud Ltd. All Rights Reserved. 2018 版权所有