2009-05-20 43 views
6

Tôi tò mò vì tôi không thể tìm hiểu về điều này trên MSDN. Tôi đã tìm thấy các chức năng Release() có mặt trong các đối tượng COM khác nhau mà tôi rõ ràng là nghĩa vụ phải sử dụng để xóa con trỏ. Nhưng tôi không chắc nó quay trở lại chính xác? Tôi đã từng nghĩ rằng nó sẽ trả lại số lượng tài liệu tham khảo vẫn còn tồn tại cho đối tượng còn lại, do đó, chẳng hạn như:Đối tượng Microsoft, các hàm Release() trả về giá trị?

while(pointer->Release() > 0); 

Rõ ràng là sẽ giải phóng tất cả các tham chiếu đến con trỏ đó?

Hoặc tôi không thấy gì đó?

* lưu ý Tôi đang nói về điều này từ khái niệm về hàm IDirect3DTexture9::Release()

Trả lời

10

Lý thuyết của bạn là đúng. Quản lý bộ nhớ COM dựa trên việc đếm tham chiếu. Phương thức Release của giao diện IUnknown sẽ giảm số lượng tham chiếu và trả về. Hàm đó sẽ không giải phóng tài liệu tham khảo . Nó không biết ai giữ tài liệu tham khảo. Nó chỉ làm giảm số lượng tham chiếu cho đến khi nó đạt đến 0 và sau đó đối tượng sẽ bị hủy. Nó nguy hiểm như những người khác vẫn có thể giữ một tham chiếu đến nó mà sẽ trở thành không hợp lệ sau khi phá hủy của đối tượng.

Do đó, bạn chỉ nên gọi Release cho mỗi AddRef trước đây bạn đã gọi.

11

Ngoài những gì Mehrdad đã nói, giá trị trả lại của Bản phát hành chỉ dành cho mục đích gỡ lỗi. Mã sản xuất chỉ nên bỏ qua nó.

Looping until Release() trả về 0 chắc chắn là lỗi - bạn không bao giờ nên giải phóng tài liệu tham khảo mà bạn không sở hữu.

6

Release() sẽ trả về số lượng tham chiếu hiện tại của đối tượng. Nhưng bạn không nên làm:

while(pointer->Release() > 0); 

Điều này sẽ làm cho tham chiếu được tính bằng 0 và phá hủy đối tượng.

Trong COM quy tắc ngón tay cái đơn giản là mọi AddRef() phải tương ứng Release() (chỉ một).

thường Release() thực hiện sẽ trông như thế này:

int nCount = InterlockedDecrement(&this->m_cRef); //Decrement the ref count 
if (nCount == 0) 
{ 
    delete this; 
} 
return nCount; 
Các vấn đề liên quan