
定义成一个数据结构不就成了比如:
struct Type{
CString intro_name;
CString intro_no;
CString intro_cust;
CString intro_contact;
CString intro_tel;
CString intro_intro;
CString intro_modelName;
};
Type a;
aintro_modelName aintro_name不就一一对应了嘛
从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数据才可以。
以上就是关于MFC静态字符串数组全部的内容,包括:MFC静态字符串数组、MFC CString::GetBuffer、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)