2010-02-26 16 views

risposta

7

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.

+1

@ Nick, grazie. Ho appena scritto un piccolo programma per testare ReleaseBuffer(), hai ragione !! Grazie! – Landy

3

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.

+0

@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

+2

+ 1 per una favolosa regola generale. –

+0

@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

0

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(); 
Problemi correlati