2010-02-26 41 views

Trả lời

7

Tôi không chắc chắn rằng điều này sẽ gây ra rò rỉ bộ nhớ, nhưng bạn phải gọi ReleaseBuffer để đảm bảo rằng các thành viên riêng của CString được cập nhật. Ví dụ, ReleaseBuffer sẽ cập nhật trường độ dài của CString bằng cách tìm ký tự null kết thúc.

+1

@Nick, cảm ơn bạn. Tôi vừa viết một chương trình nhỏ để kiểm tra ReleaseBuffer(), bạn đã đúng !! Cảm ơn bạn! – Landy

3

Điều gì sẽ xảy ra nếu tôi không sử dụng ReleaseBuffer sau GetBuffer()?

tôi đã không sử dụng MFC (và hy vọng sẽ không bao giờ phải chạm vào nó với một cực mười-foot) nhưng, như một quy luật của, bất cứ khi nào bạn có một API mà có cả GetXXX()ReleaseXXX() (đặc biệt là khi kết quả của GetXXX() thuận tiện là loại mà ReleaseXXX() mất) - sau đó khi bạn quên gọi ReleaseXXX() cho mỗi một trong các cuộc gọi GetXXX() của mình, bạn sẽ bị rò rỉ XXX.

+0

@sbi, cảm ơn bạn. Từ bài đăng này - http://stackoverflow.com/questions/559483/cstring-to-char, "gọi phương thức GetBuffer sẽ không dẫn đến bất kỳ rò rỉ bộ nhớ nào. Bởi vì destructor sẽ giải quyết bộ đệm dù sao đi nữa." – Landy

+2

+ 1 cho một quy tắc tuyệt vời của ngón tay cái. –

+0

@Landy: Vâng, có bạn đi. Vì vậy, trong trường hợp này, quy tắc của ngón cái dường như thất bại. Tôi đoán đó là lý do tại sao nó được gọi là "quy tắc của ngón tay cái", sau khi tất cả, không? Vâng, tôi đã nói tôi không thích MFC? Bây giờ có thêm một lý do nữa để làm như vậy. Một API mà 'GetXXX()' và 'ReleaseXXX()' không đi theo cặp chỉ đơn giản là hút ... Dù sao, từ http://msdn.microsoft.com/en-us/library/awkwbzyc.aspx: " Sau khi bạn sửa đổi nội dung của đối tượng CString trực tiếp, bạn phải gọi ReleaseBuffer trước khi bạn gọi bất kỳ hàm thành viên CString nào khác. " – sbi

0

Dưới đây là một ví dụ về cách tôi đã sử dụng CString :: GetBuffer() và 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(); 
Các vấn đề liên quan