2010-02-26 1 views

ответ

7

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

+1

@Nick, спасибо. Я просто написал небольшую программу для тестирования ReleaseBuffer(), вы правы! Спасибо! – Landy

3

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

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

+0

@sbi, спасибо. Из этого сообщения http://stackoverflow.com/questions/559483/cstring-to-char «вызов метода GetBuffer не приведет к утечке памяти. Поскольку деструктор все равно освободит буфер». – Landy

+2

+ 1 для сказочного эмпирического правила. –

+0

@ Landy: Ну, вот и все. Итак, в этом случае эмпирическое правило, похоже, терпит неудачу. Наверное, поэтому это называется «эмпирическим правилом», в конце концов, нет? Ну, я сказал, что мне не нравится MFC? Теперь есть еще одна причина. API, где 'GetXXX() и' ReleaseXXX() 'не попадают в пары, просто отстой ... В любом случае, с http://msdn.microsoft.com/en-us/library/awkwbzyc.aspx:" После того, как вы измените содержимое объекта CString напрямую, вы должны вызвать ReleaseBuffer, прежде чем вы вызовете другие функции-члены CString. " – sbi

0

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