Od CString to char*, funkcja ReleaseBuffer() musi być używana po GetBuffer(). Ale dlaczego? Co się stanie, jeśli nie użyję ReleaseBuffer po GetBuffer()? Czy ktoś może mi pokazać przykład? Dzięki.Co jeśli nie zadzwonię do ReleaseBuffer po GetBuffer?
Odpowiedz
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.
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
.
@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
+ 1 na bajeczną regułę. –
@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
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();
@Nick, dziękuję. Właśnie napisałem mały program do przetestowania wersji ReleaseBuffer(), masz rację! Dziękuję Ci! – Landy