От CString до char* после GetBuffer()
необходимо использовать ReleaseBuffer()
. Но почему? Что произойдет, если я не буду использовать ReleaseBuffer()
после GetBuffer()
?
Может ли кто-нибудь показать мне пример? Спасибо.
От CString до char* после GetBuffer()
необходимо использовать ReleaseBuffer()
. Но почему? Что произойдет, если я не буду использовать ReleaseBuffer()
после GetBuffer()
?
Может ли кто-нибудь показать мне пример? Спасибо.
Я не уверен, что это приведет к утечке памяти, но вы должны вызвать ReleaseBuffer
, чтобы убедиться, что закрытые члены CString
обновлены. Например, ReleaseBuffer
обновит поле длины CString
, ища завершающий символ null
.
const
, для которого не требуется GetBuffer
- просто приведение к PCTSTR
.
- person Mark Ransom; 28.02.2019
Что произойдет, если я не буду использовать
ReleaseBuffer()
послеGetBuffer()
?
Я не использовал MFC (и, надеюсь, мне никогда не придется касаться его десятифутовым шестом), но, как правило, всякий раз, когда у вас есть API, который имеет как GetXXX()
, так и ReleaseXXX()
(особенно когда результат GetXXX()
удобно относится к типу, который принимает ReleaseXXX()
) -- тогда, когда вы забываете вызывать ReleaseXXX()
для каждого из ваших вызовов GetXXX()
, вы пропускаете XXX
.
GetXXX()
и ReleaseXXX()
не идут парами, просто отстой... Во всяком случае, из msdn.microsoft.com/en-us/library/awkwbzyc.aspx: после непосредственного изменения содержимого объекта CString необходимо вызвать ReleaseBuffer перед вызовом любых других функций-членов CString.
- person sbi; 26.02.2010
Вот пример того, как я использовал 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()