Từ CString to char*, ReleaseBuffer() phải được sử dụng sau GetBuffer(). Nhưng tại sao? Điều gì sẽ xảy ra nếu tôi không sử dụng ReleaseBuffer sau GetBuffer()? Ai đó có thể cho tôi xem một ví dụ không? Cảm ơn.Nếu tôi không gọi ReleaseBuffer sau GetBuffer thì sao?
Trả lời
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.
Đ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()
và 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
.
@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
+ 1 cho một quy tắc tuyệt vời của ngón tay cái. –
@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
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();
- 1. Nếu tôi không viết mặc định trong trường hợp chuyển đổi thì sao?
- 2. Nếu JRE của tôi không hỗ trợ mã hóa ký tự thì sao?
- 3. Nếu call_user_func có nghĩa vụ trả về false thì sao?
- 4. Nếu tôi cấp phát bộ nhớ bằng mmap thay vì malloc thì sao?
- 5. Nếu câu lệnh được đánh giá bằng C++ thì sao?
- 6. Tôi có phải gọi addSubview sau khi gọi addChildViewController không?
- 7. Nên nếu gọi SqlDataReader.HasRows nếu tôi đang gọi SqlReader.Read
- 8. Tại sao tập lệnh của tôi theo sau/etc/hosts nhưng các trình duyệt thì không, khi có proxy SOCKS?
- 9. Nếu `main` là một thể hiện của` Object`, tại sao tôi không thể gọi nó?
- 10. Quartz cron - nếu ngày trong tháng không tồn tại thì sao?
- 11. Khi nào thì gọi SaveChanges
- 12. Tại sao __init__ không được gọi nếu __new__ được gọi là không có args
- 13. Tôi có thể thực hiện Caching trong MVC không, nếu có thì làm cách nào?
- 14. Nếu-thì-khác trong biểu thức JSP?
- 15. Tại sao __init__ không được gọi sau __new__ SOMETIMES
- 16. Có vấn đề rò rỉ bộ nhớ nào nếu không gọi clearTimout sau khi gọi setTimeout
- 17. Nếu Notepad.exe đang chạy thì taskkill nếu không chạy đến câu lệnh tiếp theo
- 18. Tại sao tôi phải gọi super -ealloc sau cùng và không phải trước tiên?
- 19. Tại sao tôi không thể làm "nếu không" bằng ruby?
- 20. Còn nếu bạn có cùng thông số nhiều lần trong String.format thì sao?
- 21. tại sao "onPause" không được gọi trong tình huống sau?
- 22. Tại sao cuộc gọi lại jQuery.get() của tôi không được gọi?
- 23. Nếu tôi chọn từ một IQueryable thì Bao gồm bị mất
- 24. AutoMapper làm phẳng mô hình miền nhưng nó có làm ngược lại không? Nếu không, thì sao?
- 25. Tại sao màu nền của tôi không hiển thị nếu tôi có màn hình: inline?
- 26. Nếu xử lý tiền trong một phao là xấu, thì tại sao money_format() làm điều đó?
- 27. Tôi có cần gọi lại nếu tôi không bao giờ cam kết không?
- 28. Khi nào thì initWithCoder được gọi?
- 29. python 2 code: nếu python 3 thì sys.exit()
- 30. Nếu tôi xác định một mảng trong câu lệnh if thì bộ nhớ có được cấp phát không?
@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