2010-02-26 9 views

Odpowiedz

7

Nie jestem pewien, czy spowoduje to wyciek pamięci, ale musisz zadzwonić do ReleaseBuffer, aby upewnić się, że prywatni członkowie CString są zaktualizowani. Na przykład, ReleaseBuffer zaktualizuje pole długości CString, szukając kończącego znaku pustego.

+1

@Nick, dziękuję. Właśnie napisałem mały program do przetestowania wersji ReleaseBuffer(), masz rację! Dziękuję Ci! – Landy

3

Co się stanie, jeśli nie używam ReleaseBuffer po GetBuffer()?

Nie używałem MFC (i miejmy nadzieję, że nigdy nie będzie musiał go dotknąć kijem dziesięć stóp), ale jako zasada, gdy masz API, które ma zarówno GetXXX() i ReleaseXXX() (szczególnie, gdy wynik wynosi GetXXX() dogodnie jest taki, jakiego wymaga ReleaseXXX()) - wtedy, gdy zapomnisz zadzwonić pod numer ReleaseXXX() dla każdego połączenia GetXXX(), wycieknieś XXX.

+0

@sbi, dziękuję. Z tego postu - http://stackoverflow.com/questions/559483/cstring-to-char, "wywołanie metody GetBuffer nie doprowadzi do żadnych wycieków pamięci, ponieważ i tak destruktor i tak zwolni bufor." – Landy

+2

+ 1 na bajeczną regułę. –

+0

@Landy: Cóż, proszę bardzo. Tak więc w tym przypadku zasada wydaje się nieskuteczna. Sądzę, że właśnie dlatego jest nazywana "regułą", w końcu, nie? Cóż, czy powiedziałem, że nie lubię MFC? Jest jeszcze jeden powód, aby to zrobić. Interfejs API, w którym 'GetXXX()' i 'ReleaseXXX()' nie występują w parach, są po prostu srodze ... W każdym razie z http://msdn.microsoft.com/en-us/library/awkwbzyc.aspx: " Po zmodyfikowaniu zawartości obiektu CString bezpośrednio, musisz zadzwonić do ReleaseBuffer zanim zadzwonisz do innych funkcji członka CString. " – sbi

0

Oto przykład tego, jak kiedyś CString :: GetBuffer() i 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(); 
Powiązane problemy