MFC CString::GetBuffer

MFC CString::GetBuffer,第1张

从MSDN的官方解释来说,GetBuffer是将字符串的缓冲区长度锁定,releaseBuffer是解除锁定,那么在进行CString *** 作前,应该releaseBuffer。

其实从底层代码上看,是这样的,MessageBox(k1)不报错,是因为地址空间确实已经赋值,内存中有东西。但实际上,在release之前,不仅GetAt报错,GetLength获取到的长度是0,那么为什么呢,我们看ReleaseBuffer的底层代码:

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[nNewLength] = '\0';

}

void CString::CopyBeforeWrite()

{

if (GetData()->nRefs > 1)

{

CStringData pData = GetData();

Release();

AllocBuffer(pData->nDataLength);

memcpy(m_pchData, pData->data(), (pData->nDataLength+1)sizeof(TCHAR));

}

ASSERT(GetData()->nRefs <= 1);

}

从这里可以看出,其实CString的各种变量,在ReleaseBuffer之前,是没有被更新的,而GetAt函数需要获取CString长度,并且通过GetData来获取数据(而不是直接从内存),这样肯定会出现断言错误。

如果希望GetBuffer并进行内存 *** 作之后,CString各种功能,只能先调用ReleaseBuffer更新CString数据才可以。

strlen()是C语言的字符串长度函数,它只能用于C风格字符串,不能用于C++的string。

C++的string有一个length()成员函数,它返回该字符串的长度。

cout<<strlength()<<endl;

使用string类型前,需要#include<string>。

你要注意,TCHAR是一种变量类型,它只有 *** 作符的;而CString是一个类,它有函数可以完成很多功能。

比如你这样定义CString str = "abc";这时str的长度是3,如果你想给它赋一个更长的值,如str = "1234567";是没问题的,这是怎么实现的呢?答案在于CString类重载了赋值 *** 作符“=”,在重载函数里面废除原来的空间,然后重新分配一片新的内存空间,将1234567放进去,就是这样实现动态长度的。

GetBuffer(int size)是用来返回一个你所指定大小可写内存的成员方法。它和被重载的 *** 作符LPCTSTR还是有点本质区别的,LPCTSTR是直接返回一个只读内存的指针,而GetBuffer则是返回一个可以供调用者写入的内存,并且,你可以给定大小。下面是个简单的,但也是非常典型的例子: int readFile(CString& str, const CString& strPathName) { FILE fp = fopen(strPathName, "r"); // 打开文件 fseek(fp, 0, SEEK_END); int nLen = ftell(fp); // 获得文件长度 fseek(fp, 0, SEEK_SET); // 重置读指针 char psz = strGetBuffer(nLen); fread(psz, sizeof(char), nLen, fp); //读文件内容 strReleaseBuffer(); //千万不能缺少 fclose(fp); } 上面的函数是GetBuffer函数最典型的用法了,其实它就相当于申请一块nLen大小的内存,只不过,这块内存是被引用在CString对象的内部而已,这是非常有效的一种用法,如果不直接用GetBuffer函数来申请的话,那么你必须用new *** 作符(或者malloc()函数)在CString的外部申请,然后再将申请的内存拷贝到CString对象中,显然这是一个非常冗余的 *** 作,会使你函数的效率大大下降

VB我不太清楚。就不能帮你了。希望能解决你的问题。如果还不懂可以看看GetBuffer函数的用法。网上资料很多的 。

以上就是关于MFC CString::GetBuffer全部的内容,包括:MFC CString::GetBuffer、c++写一个程式,从标准输入取得一系列字串,输出每个字串的长度、CString 是怎么样实现动态改变字符串长度的么在定义字符串之前不是已经规定它的长度了么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9662282.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存