Da CString to char*, ReleaseBuffer() deve essere utilizzato dopo GetBuffer(). Ma perché? Cosa succederà se non utilizzo ReleaseBuffer dopo GetBuffer()? Qualcuno può mostrarmi un esempio? Grazie.Cosa succede se non richiamo ReleaseBuffer dopo GetBuffer?
risposta
Non sono sicuro che ciò causerà una perdita di memoria, ma è necessario chiamare ReleaseBuffer per garantire che i membri privati di CString vengano aggiornati. Ad esempio, ReleaseBuffer aggiornerà il campo della lunghezza del CString cercando il carattere null terminante.
Cosa succede se non utilizzo ReleaseBuffer dopo GetBuffer()?
non ho usato MFC (e si spera non avrò mai toccarlo con un palo di dieci piedi), ma, come regola generale, ogni volta che avete un'API che ha sia GetXXX()
e ReleaseXXX()
(specialmente quando il risultato di GetXXX()
è del tipo che assume ReleaseXXX()
), quindi quando si dimentica di chiamare ReleaseXXX()
per ognuna delle chiamate GetXXX()
, si verificherà una perdita di XXX
.
@sbi, grazie. Da questo post: http://stackoverflow.com/questions/559483/cstring-to-char, "chiamare il metodo GetBuffer non porterà a perdite di memoria perché il distruttore sta per deallocare il buffer in ogni caso." – Landy
+ 1 per una favolosa regola generale. –
@Landy: Bene, ecco qua. Quindi, in questo caso, la regola empirica sembra fallire. Credo che sia per questo che si chiama "regola generale", dopo tutto, no? Bene, ho detto che non mi piace il MFC? Ora c'è un motivo in più per farlo. Un'API in cui 'GetXXX()' e 'ReleaseXXX()' non arrivano in coppia semplicemente schifo ... Comunque, da http://msdn.microsoft.com/en-us/library/awkwbzyc.aspx: " Dopo aver modificato direttamente il contenuto di un oggetto CString, è necessario chiamare ReleaseBuffer prima di chiamare qualsiasi altra funzione membro CString. " – sbi
Ecco un esempio di come ho usato CString :: GetBuffer() e 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. Cosa succede se nuovo fallisce?
- 2. Cosa succede se chiudi una connessione chiusa?
- 3. Cosa succede a unique_ptr dopo std :: move()?
- 4. Cosa succede se Zookeeper fallisce completamente?
- 5. Cosa succede a AsyncTasks dopo onPause?
- 6. ASP.NET: Cosa succede al codice dopo Response.Redirect (...)?
- 7. Cosa succede se I ReleaseMutex() due volte?
- 8. Cosa succede se call_user_func deve restituire false?
- 9. Cosa succede se un'operazione di TableBatchOperation fallisce?
- 10. Cosa succede se un costruttore lancia un'eccezione?
- 11. Cosa succede se JWT viene rubato?
- 12. Casuale di Python: cosa succede se non utilizzo seed (someValue)?
- 13. Cosa succede se un costruttore di shared_ptr non riesce?
- 14. Cosa succede se non si chiama mai Socket.EndConnect?
- 15. cosa succede se non risolviamo o rifiutiamo la promessa
- 16. Haskell - Implementare Monoid cosa succede se l'operatore non è associativo
- 17. Cosa succede se non si ripristina una transazione in Hibernate?
- 18. Cosa succede se non chiudi un filehandle in Perl?
- 19. Cosa succede se non implemento Serializable quando si utilizza Hashmap
- 20. Cosa succede se reimpostare uno std :: shared_ptr a se stesso
- 21. Cosa succede se una scrittura su localStorage viene cancellata?
- 22. Cosa succede ai pixel dopo averli passati in glTexImage2D()?
- 23. In Akka, cosa succede se guardo() un ActorRef guasto?
- 24. Cosa succede se voglio implementare una query complicata in REST
- 25. Cosa succede dopo che un metodo viene chiamato in Java
- 26. Cosa succede al codice dopo un reindirizzamento javascript (impostazione window.location.href)?
- 27. Cosa succede se si interrompe un push Git?
- 28. Cosa succede se return false in OnCreate of ContentProvider?
- 29. Cosa succede se si seleziona SCOPE_IDENTITY() dopo un errore dell'inserto (SQL Server 2005)
- 30. Cosa succede con l'utilizzo della memoria dopo exec *()
@ Nick, grazie. Ho appena scritto un piccolo programma per testare ReleaseBuffer(), hai ragione !! Grazie! – Landy