CString::GetBuffer(int nMinBufLength);CString::ReleaseBuffer(int nNewLength)
2013-03-05 13:42
621 查看
LPTSTR CString::GetBuffer(int nMinBufLength)
{
ASSERT(nMinBufLength >= 0);
if (GetData()->nRefs > 1 || nMinBufLength > GetData()->nAllocLength)
{
#ifdef _DEBUG
// give a warning in case locked string becomes unlocked
if (GetData() != _afxDataNil && GetData()->nRefs < 0)
TRACE0("Warning: GetBuffer on locked CString creates unlocked CString!\n");
#endif
// we have to grow the buffer
CStringData* pOldData = GetData();
int nOldLen = GetData()->nDataLength; // AllocBuffer will tromp it
if (nMinBufLength < nOldLen)
nMinBufLength = nOldLen;
AllocBuffer(nMinBufLength);
memcpy(m_pchData, pOldData->data(), (nOldLen+1)*sizeof(TCHAR));
GetData()->nDataLength = nOldLen;
CString::Release(pOldData);
}
ASSERT(GetData()->nRefs <= 1);
// return a pointer to the character storage for this string
ASSERT(m_pchData != NULL);
return m_pchData;
}
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';
}
{
ASSERT(nMinBufLength >= 0);
if (GetData()->nRefs > 1 || nMinBufLength > GetData()->nAllocLength)
{
#ifdef _DEBUG
// give a warning in case locked string becomes unlocked
if (GetData() != _afxDataNil && GetData()->nRefs < 0)
TRACE0("Warning: GetBuffer on locked CString creates unlocked CString!\n");
#endif
// we have to grow the buffer
CStringData* pOldData = GetData();
int nOldLen = GetData()->nDataLength; // AllocBuffer will tromp it
if (nMinBufLength < nOldLen)
nMinBufLength = nOldLen;
AllocBuffer(nMinBufLength);
memcpy(m_pchData, pOldData->data(), (nOldLen+1)*sizeof(TCHAR));
GetData()->nDataLength = nOldLen;
CString::Release(pOldData);
}
ASSERT(GetData()->nRefs <= 1);
// return a pointer to the character storage for this string
ASSERT(m_pchData != NULL);
return m_pchData;
}
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';
}
相关文章推荐
- CString 类型的GetBuffer与ReleaseBuffer.
- CString:Getbuffer和Releasebuffer的作用
- 分析: GetBuffer, ReleaseBuffer, GetBufferSetLength(转载)
- CString中的GetBuffer()和ReleaseBuffer()
- CString::GetBuffer()和CString::ReleaseBuffer()
- CString GetBuffer()和ReleaseBuffer()分析
- CString GetBuffer() and ReleaseBuffer()
- CString:Getbuffer和Releasebuffer的作用
- CString GetBuffer() 与releasebuffer()的使用
- 分析: GetBuffer, ReleaseBuffer, GetBufferSetLength
- CString中使用GetBufferSetLength和GetBuffer后执行releasebuffer的原理及必要性
- GetBuffer, ReleaseBuffer, GetBufferSetLength
- 分析: GetBuffer, ReleaseBuffer, GetBufferSetLength
- CString GetBuffer() and ReleaseBuffer()
- 分析: GetBuffer, ReleaseBuffer, GetBufferSetLength
- CString GetBuffer() and ReleaseBuffer()
- 关于CString的GetBuffer 和 ReleaseBuffer
- CString 的getbuffer和releasebuffer~
- GetBuffer, ReleaseBuffer, GetBufferSetLength(转)
- GetBuffer, ReleaseBuffer, GetBufferSetLength