Что если я не вызову ReleaseBuffer после GetBuffer? - PullRequest
14 голосов
/ 26 февраля 2010

От CString до char *, ReleaseBuffer() необходимо использовать после GetBuffer(). Но почему? Что произойдет, если я не буду использовать ReleaseBuffer() после GetBuffer()?

Может кто-нибудь показать мне пример? Спасибо.

Ответы [ 4 ]

11 голосов
/ 26 февраля 2010

Я не уверен, что это приведет к утечке памяти, но вы должны вызвать ReleaseBuffer, чтобы убедиться, что закрытые члены CString обновлены. Например, ReleaseBuffer обновит поле длины CString путем поиска завершающего символа null.

3 голосов
/ 26 февраля 2010

Что произойдет, если я не буду использовать ReleaseBuffer() после GetBuffer()?

Я не использовал MFC (и, надеюсь, никогда не придется прикасаться к нему полюсом в десять футов), но, как правило, всякий раз, когда у вас есть API, который имеет как GetXXX(), так и ReleaseXXX() (особенно, когда результат GetXXX() имеет тот тип, который принимает ReleaseXXX()) - тогда, когда вы забудете вызвать ReleaseXXX() для каждого из ваших GetXXX() вызовов, вы пропустите XXX.

0 голосов
/ 19 июня 2019

Если вы не изменяете содержимое CString с помощью указателя, полученного с помощью GetBuffer (), вам НЕ нужно вызывать ReleaseBuffer () впоследствии

0 голосов
/ 01 марта 2012

Вот пример того, как я использовал 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();
...