2008-10-01 26 views
7

Tôi đang lưu trữ một đối tượng (TTF_Font) trong một shared_ptr được cung cấp cho tôi từ API của bên thứ ba. Tôi không thể sử dụng mới hoặc xóa trên đối tượng, do đó, shared_ptr cũng được cung cấp một hàm "giải phóng".Sử dụng .reset() để giải phóng quảng cáo :: shared_ptr với quyền sở hữu duy nhất

// Functor 
struct CloseFont 
{ 
    void operator()(TTF_Font* font) const 
    { 
     if(font != NULL) { 
      TTF_CloseFont(font); 
     } 
    } 
}; 

boost::shared_ptr<TTF_Font> screenFont; 

screenFont = boost::shared_ptr<TTF_Font>(TTF_OpenFont("slkscr.ttf", 8), CloseFont()); 

Nếu sau đó, tôi cần phải dứt khoát miễn phí đối tượng này là nó đúng để làm điều này:

screenFont.reset(); 

Và sau đó để screenFont (đối tượng thực tế shared_ptr) bị phá hủy một cách tự nhiên?

Trả lời

16

shared_ptr <> :: reset() sẽ giảm số lần truy cập một. Nếu điều đó dẫn đến số lượng giảm xuống 0, tài nguyên được chỉ định bởi shared_ptr <> sẽ được giải phóng.

Vì vậy, tôi nghĩ câu trả lời cho bạn là, vâng điều đó sẽ hiệu quả. Hoặc bạn có thể chỉ đơn giản là để biến screenFont bị phá hủy do bỏ ra khỏi phạm vi hoặc bất cứ điều gì, nếu đó là những gì sắp xảy ra.

Để rõ ràng, việc sử dụng bình thường của shared_ptr <> là bạn để cho nó bị phá hủy một cách tự nhiên, và nó sẽ đối phó với số lần truy cập và giải phóng tài nguyên khi nó tự động giảm xuống. reset() chỉ được yêu cầu nếu bạn cần phát hành phiên bản cụ thể của tài nguyên được chia sẻ trước khi shared_ptr <> sẽ bị hủy một cách tự nhiên.

+1

Cảm ơn bạn đã trả lời. Trong trường hợp của tôi, tôi phải giải phóng nó một cách rõ ràng trước một tài nguyên khác, và đây là cách duy nhất tôi tìm thấy để làm điều đó. –

+2

Chỉ cần rõ ràng - đặt lại() sẽ không giải phóng tài nguyên được giữ trừ khi nó dẫn đến việc số lần truy cập bị giảm xuống 0 - nó không ép buộc số lần truy cập bằng không. –

0

Mike B đã trả lời câu hỏi của bạn, vì vậy tôi sẽ chỉ nhận xét về mã của bạn. Nếu TTF_OpenFont không trả về null hoặc nếu TTF_CloseFont có thể xử lý null vô hại, bạn không cần lớp học CloseFont chút nào, chỉ cần sử dụng &TTF_CloseFont.

+0

Cảm ơn. Đó là những gì tôi đã làm ban đầu. Tôi tìm thấy một lỗi liên quan đến một tài nguyên khác được giải phóng trước tài nguyên phông chữ của tôi và cố gắng giải quyết nó bằng phương pháp trên. Mặc dù lỗi này không liên quan đến functor, tôi giữ nó bởi vì tôi đang xử lý các tài nguyên khác với cùng một mẫu. –

Các vấn đề liên quan