От CString to char*, ReleaseBuffer() должен использоваться после GetBuffer(). Но почему? Что произойдет, если я не буду использовать ReleaseBuffer после GetBuffer()? Может ли кто-нибудь показать мне пример? Благодарю.Что делать, если я не позволю ReleaseBuffer после GetBuffer?
ответ
Я не уверен, что это вызовет утечку памяти, но вы должны вызвать ReleaseBuffer, чтобы убедиться, что частные члены CString обновлены. Например, ReleaseBuffer будет обновлять поле длины CString, ища завершающий нулевой символ.
Что произойдет, если я не воспользуюсь ReleaseBuffer после GetBuffer()?
Я не использовал MFC (и, надеюсь, никогда не будет иметь, чтобы прикоснуться к ней десять футов полюсом), но, как правило, всякий раз, когда у вас есть API, который имеет как GetXXX()
и ReleaseXXX()
(особенно если результат GetXXX()
имеет тип ReleaseXXX()
) - тогда, когда вы забудете позвонить ReleaseXXX()
для каждого звонка GetXXX()
, вы пронесете XXX
.
@sbi, спасибо. Из этого сообщения http://stackoverflow.com/questions/559483/cstring-to-char «вызов метода GetBuffer не приведет к утечке памяти. Поскольку деструктор все равно освободит буфер». – Landy
+ 1 для сказочного эмпирического правила. –
@ Landy: Ну, вот и все. Итак, в этом случае эмпирическое правило, похоже, терпит неудачу. Наверное, поэтому это называется «эмпирическим правилом», в конце концов, нет? Ну, я сказал, что мне не нравится MFC? Теперь есть еще одна причина. API, где 'GetXXX() и' ReleaseXXX() 'не попадают в пары, просто отстой ... В любом случае, с http://msdn.microsoft.com/en-us/library/awkwbzyc.aspx:" После того, как вы измените содержимое объекта CString напрямую, вы должны вызвать ReleaseBuffer, прежде чем вы вызовете другие функции-члены CString. " – sbi
Вот пример того, как я использовал 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();
@Nick, спасибо. Я просто написал небольшую программу для тестирования ReleaseBuffer(), вы правы! Спасибо! – Landy