2010-02-24 38 views
6

Tôi hiện đang cố khắc phục một số điểm yếu trong cơ sở mã của chúng tôi bằng cách giới thiệu việc sử dụng các con trỏ thông minh. Các cơ sở mã là rất lớn, và liên kết với nhau như một con nhện có một đến nhiều cà phê.Làm thế nào để giới thiệu boost :: shared_ptr vào một codebase C++ hiện có (lớn)?

Tôi đã tự hỏi nếu mọi người đã thử trước và cách tiếp cận của họ là gì.

Bước đầu tiên của tôi là vào các lớp typedef, như sau.

#ifndef USE_SMART_POINTERS 
    #define USE_SMART_POINTERS 0 
#endif 

#if USE_SMART_POINTERS == 1 
    #include <boost/smart_ptr.hpp> 
#endif 


namespace ProductX 
{ 
    // forward decleration 
    class CTObject; 


    //typedefs 
    #if USE_SMART_POINTERS == 1 
     typedef boost::shared_ptr<CTObject> CTObjectPtr; 
    #else 
     typedef CTObject* CObjectPtr; 
    #endif 
} 

Bây giờ tôi nhận ra điều này sẽ dẫn đến một sự giàu có của vùng biên dịch, những thứ như

CTObjectPtr i = NULL; 

sẽ hoàn toàn bork khi con trỏ thông minh được kích hoạt.

Tôi đã tự hỏi nếu có bất kỳ điều gì tôi có thể làm ở giai đoạn đầu này để giảm khối lượng biên dịch lỗi, hoặc là tôi nghi ngờ chỉ cần thực hiện mọi thứ trên cơ sở từng trường hợp.

Cheers Giàu

Trả lời

9

Đừng làm điều này: typedefs tôi có ý nghĩa.

Có lẽ mã cũ có ít nhất một số xóa cuộc gọi trong đó? Mà chắc chắn sẽ thất bại trong trường hợp của một con trỏ thông minh.

Con trỏ thông minh nhất định hoặc không, ví dụ: theo đuổi một phiên bản cụ thể thông qua cơ sở mã. Làm cho nó hoạt động, sau đó di chuyển trên. Chúc may mắn!

+0

Nhìn vào sự giàu có của mã Tôi bắt đầu nghĩ rằng bạn đúng. Cảm ơn bạn đã dừng tôi đi trên một đoạn mã ngu ngốc. – Rich

6

Thay vì cố gắng giới thiệu con trỏ thông minh ở mọi nơi bạn có thể sử dụng bộ thu gom rác Boehm-Demers-Weiser và để nguyên cơ sở mã của bạn.

Nó cũng sẽ xử lý các tham chiếu tuần hoàn.

+3

+1: điều quan trọng là nhận xét về các tham chiếu tuần hoàn. Đó là điều cần chú ý nếu sử dụng con trỏ thông minh (sử dụng 'weak_ptr' để phá vỡ chu kỳ) –

+6

Điểm quan trọng về bộ thu thập Boehm là bảo thủ - nó không được đảm bảo để dọn sạch tất cả rác. Cũng không phải là xác định, giống như tất cả các nhà sưu tập được tính không tham chiếu. – Joel

3

Không có cách nào dễ dàng để thực hiện việc này. Như bạn đã phát hiện ra, boost::shared_ptr s và con trỏ chuẩn không thể hoán đổi cho nhau. Những gì bạn đang làm ở đây là tái cấu trúc mã, và việc tái cấu trúc không may mất một thời gian dài và có thể rất tẻ nhạt.

Như sdg đã nói, typedef con trỏ ing cho shared_ptr s không phải là một ý tưởng hay và chỉ tăng số lượng mã bạn phải viết.

Trước tiên, tôi sẽ xác định các con trỏ thực sự cần được thay đổi thành shared_ptr s. Rõ ràng bạn không muốn thay đổi tất cả các con trỏ thành shared_ptr s. Hầu hết có lẽ sẽ tốt hơn là std::auto_ptr s hoặc boost::scoped_ptr s và một số sẽ tốt hơn là boost::weak_ptr, và cuối cùng một số chỉ có thể là tốt như đồng bằng C-phong cách con trỏ.

Chỉ cần xem từng con trỏ cần thay đổi từng cái một, tìm tất cả các tham chiếu đến nó và thực hiện các điều chỉnh cần thiết (ví dụ: xóa cuộc gọi đến delete).

+0

Có lẽ cách dễ nhất để bắt đầu chuyển đổi như vậy (nếu bạn chắc chắn một loại cụ thể luôn là 'shared_ptr' hoặc' weak_ptr') là sử dụng mẫu tự tạo - tạo shared_ptr tĩnh X: : create (...) phương thức, và thay đổi constructor thành private hoặc protected. Bây giờ sửa chữa tất cả các lỗi trình biên dịch. Chỉ làm một loại tại một thời điểm! (Vâng, bạn có thể cần phải làm các lớp học có nguồn gốc cùng một lúc.) – Miral

0

Tôi sẽ rất hạn chế trong việc giới thiệu shared_ptr vào một codebase lớn hiện có. Nếu bạn thực sự muốn sử dụng con trỏ thông minh để sửa lỗi, tôi khuyên bạn nên sử dụng con trỏ có phạm vi và khác với mã tôi sẽ cấu trúc lại và thiết kế quyền sở hữu rõ ràng.

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