От CString до char *, ReleaseBuffer() должен использоваться после GetBuffer(). Но почему? Что произойдет, если я не использую ReleaseBuffer() после GetBuffer()?
Может кто-нибудь показать мне пример? Благодарю.
От CString до char *, ReleaseBuffer() должен использоваться после GetBuffer(). Но почему? Что произойдет, если я не использую ReleaseBuffer() после GetBuffer()?
Может кто-нибудь показать мне пример? Благодарю.
Я не уверен, что это приведет к утечке памяти, но вы должны вызвать ReleaseBuffer чтобы убедиться, что закрытые члены CString обновлены. Например, ReleaseBuffer обновит поле длины ReleaseBuffer CString путем поиска завершающего null символа.
Что произойдет, если я не использую
ReleaseBuffer()послеGetBuffer()?
Я не использовал MFC (и, надеюсь, никогда не придется касаться его полюсом в десять футов), но, как правило, всякий раз, когда у вас есть API, который имеет как GetXXX() и ReleaseXXX() (особенно когда результат GetXXX() удобно имеет тот тип, который ReleaseXXX() - тогда, когда вы забудете вызывать ReleaseXXX() для каждого из ваших GetXXX(), вы GetXXX() XXX.
Вот пример того, как я использовал CString::GetBuffer() и CString::ReleaseBuffer():
LPTSTR pUnitBuffer = pAPBElement->m_strUnits.GetBuffer(APB_UNIT_SIZE);
if (pUnitBuffer != "")
{
if (strncmp(pAPBElement->m_strUnits, (char*)pszBuffer[nLoop - nFirst], APB_UNIT_SIZE) != 0)
{
LPTSTR pUnitOriginal = pAPBElement->m_strOriginal.GetBuffer(APB_UNIT_SIZE);
strncpy(pUnitBuffer,
(char*)&pszBuffer[nLoop - nFirst],
APB_UNIT_SIZE);
strncpy(pUnitOriginal,
(char*)&pszBuffer[nLoop - nFirst],
APB_UNIT_SIZE);
pAPBElement->m_strOriginal.ReleaseBuffer();
}
}
pAPBElement->m_strUnits.ReleaseBuffer();
Если вы не изменяете содержимое CString с помощью указателя, полученного с помощью GetBuffer(), вам НЕ нужно вызывать ReleaseBuffer() впоследствии