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();
- 1. ikona hamburgera nie wyświetla się, nawet jeśli zadzwonię do componentHandler.upgradeDom();
- 2. Co się stanie, jeśli zadzwonię wait na zmienną warunku powiadomienia
- 3. Powinienem zadzwonić do SqlDataReader.HasRows, jeśli zadzwonię do SqlReader.Read
- 4. Co się stanie, jeśli zadzwonię do jQuery.post() z pustym adresem URL?
- 5. Co się stanie, gdy zadzwonię requestAnimationFrame wielokrotnie
- 6. Co używać, jeśli nie "IPHONE UDID"?
- 7. Po co przekazywać token anulowania do TaskFactory.StartNew?
- 8. Co stanie się z odgałęzieniem git po usunięciu, jeśli nie zostało scalone?
- 9. Co się stanie, jeśli klasa nie ma udokumentowanego wyznaczonego inicjatora?
- 10. Co się stanie, jeśli użyję "rzutu"; bez wyjątku do rzutu?
- 11. Co, jeśli moje środowisko JRE nie obsługuje kodowania znaków?
- 12. Co się stanie, jeśli dwukrotnie zwolnię funkcję ReleaseMutex()?
- 13. [PHP]: Co zwraca array_search(), jeśli nic nie znaleziono?
- 14. Dlaczego RequireQualifiedAccess nie działa, co prowadzi do błędu kompilacji, ale nie, jeśli używam open?
- 15. $ wpdb - co zwraca po niepowodzeniu?
- 16. LINQ do wstawienia SQL-jeśli-nie istnieje
- 17. Nie można zablokować dokumentu mongodb. Co jeśli muszę?
- 18. iOS6 Facebook: Co zrobić, jeśli użytkownik nie skonfigurował Facebooka?
- 19. Co to jest semantyka JavaScriptów Jeśli Statement
- 20. Wstaw do tabeli h2, jeśli nie istnieje
- 21. Po co zostaliście złapani?
- 22. Co jeśli w destruktorze utworzę żywą referencję do obiektu?
- 23. Po co pieczętować klasę?
- 24. wstawić, jeśli nie istnieje, po prostu wybierz w mysql
- 25. Array.Find with Delegate. Co zwraca, jeśli nie zostanie znaleziony?
- 26. Co stanie się, jeśli nie zamkniesz uchwytu pliku w Perlu?
- 27. Co powinna zostać zwrócona metoda wyszukiwania, jeśli nic nie znaleziono?
- 28. Co powinienem zrobić, jeśli metoda budowniczego łosia nie powiedzie się?
- 29. django - co powinieneś zrobić, jeśli nie potrzebujesz silnika bazy danych?
- 30. Kwarcowy cron - co jeśli dzień miesiąca nie istnieje?
@Nick, dziękuję. Właśnie napisałem mały program do przetestowania wersji ReleaseBuffer(), masz rację! Dziękuję Ci! – Landy