MFC静态字符串数组

MFC静态字符串数组,第1张

定义成一个数据结构不就成了比如:

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、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/9815461.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存