2011-01-26 11 views
5

Thỉnh thoảng, đối với những khoảnh khắc thoáng qua, tôi nghĩ auto_ptr rất tuyệt. Nhưng hầu hết thời gian tôi nhận ra rằng có nhiều kỹ thuật đơn giản hơn làm cho nó không liên quan. Ví dụ, nếu tôi muốn có một đối tượng được giải phóng tự động, ngay cả khi một ngoại lệ được ném, tôi có thể làm mới đối tượng và gán cho một auto_ptr. Rất tuyệt! Nhưng tôi có thể dễ dàng tạo ra đối tượng của tôi như là một biến địa phương, và để cho ngăn xếp chăm sóc nó (duh!).Để tắt auto_ptr

Vì vậy, tôi không quá ngạc nhiên khi tôi thấy google C++ coding standards cấm sử dụng auto_ptr. Google nói rằng scoped_ptr nên được sử dụng thay thế (nếu cần một con trỏ thông minh).

Tôi muốn biết nếu có ai, trái với trải nghiệm của mình, có thể đưa ra lý do vững chắc khi auto_ptr là điều tốt nhất hoặc đơn giản nhất để sử dụng. Nếu không, sau đó tôi cho rằng tôi sẽ cấm sử dụng nó bản thân mình (sau google dẫn).

cập nhật: Đối với những người tỏ ra quan tâm, tôi không chấp nhận tiêu chuẩn của google. Ví dụ, chống lại lời khuyên google, tôi đồng ý xử lý ngoại lệ nên được kích hoạt. Tôi cũng thích sử dụng macro tiền xử lý, chẳng hạn như printable enum tôi đã tạo. Nó chỉ là chủ đề auto_ptr đánh tôi.

update2: Hóa ra câu trả lời của tôi đến từ hai trong số những người trả lời dưới đây và note from Wikipedia. Đầu tiên, Herb Sutter đã cho thấy một sử dụng hợp lệ (thành ngữ chìm nguồn và thành phần đối tượng liên kết suốt đời). Thứ hai, có những cửa hàng mà TR1 và tăng không có sẵn hoặc bị cấm và chỉ cho phép C++ 03. Thứ ba, theo Wikipedia, thông số C++ 0x đang ngừng sử dụng auto_ptr và thay thế nó bằng unique_ptr. Vì vậy, câu trả lời của tôi là: sử dụng unique_ptr nếu có sẵn cho tôi (trên tất cả các nền tảng trong xem xét) khác sử dụng auto_ptr cho các trường hợp mà Sutter mô tả.

+3

Hướng dẫn kiểu Google cũng cấm ngoại lệ. Chúng tôi có cấm các trường hợp ngoại lệ vì ai đó khiến họ sai và hướng dẫn về phong cách của Google cấm họ không? Số – sharptooth

+3

không tuân theo nguyên tắc của Google, nói chung, chúng cụ thể cho chúng và bao gồm nhu cầu tích hợp với codebase C khổng lồ của chúng. (Có nhiều lý do không sử dụng 'auto_ptr'). –

Trả lời

7

Đó là điều đơn giản nhất để sử dụng khi bạn cần một con trỏ có phạm vi hoặc duy nhất và bạn đang làm việc trong môi trường C++ 03 nghiêm ngặt mà không truy cập vào triển khai hoặc tăng tr1.

+0

+100 nếu tôi có thể –

1

Cũng có một lý do là scoped_ptr không thể sao chép được, vì vậy sẽ an toàn hơn khi sử dụng và khó khăn hơn để mắc lỗi. auto_ptr cho phép chuyển quyền sở hữu (ví dụ: bằng cách chuyển một số khác auto_ptr làm tham số hàm tạo). Nếu bạn cần phải suy nghĩ những thứ như chuyển quyền sở hữu, cơ hội là bạn tốt hơn với một con trỏ thông minh như shared_ptr.

3

std::auto_ptr vẫn có ngữ nghĩa con trỏ, vì vậy tự động (không trỏ) biến không thể thay thế. Đặc biệt, std::auto_ptr hỗ trợ đa hình và chuyển nhượng lại. Với các biến ngăn xếp, bạn có thể sử dụng các tham chiếu cho đa hình, nhưng các tham chiếu không cho phép gán lại.

Đôi khi std::auto_ptr sẽ hoạt động tốt. Ví dụ, để thực hiện một pimpl. Đúng vậy, trong phần lớn các trường hợp, thư viện con trỏ thông minh giúp cung cấp các lựa chọn tốt hơn cho một con trỏ thông minh. Nhưng ngay bây giờ std::auto_ptr là một giải pháp tiêu chuẩn, trong khi con trỏ thông minh của boost thì không.

2

Sử dụng auto_ptr làm giá trị trả về hàm, bạn sẽ không tận hưởng phí giám sát và không bao giờ bị rò rỉ bộ nhớ. std::auto_ptr<obj> foo() có thể được gọi một cách an toàn trong { foo(); } trong khi obj *foo() không thể. boost :: shared_ptr có thể giải quyết vấn đề này, nhưng với chi phí cao hơn.

Ngoài ra, một số đối tượng không thể được tạo trên ngăn xếp do hạn chế về bộ nhớ: ngăn xếp chỉ tương đối nhỏ.Nhưng tăng :: scoped_ptr là tốt hơn trong trường hợp này vì nó không thể được vô tình phát hành.

6

Trong khi cấm auto_ptr vẻ hấp dẫn, nhưng có một vấn đề:

template <typename T> 
some_smart_ptr<T> create(); 

bạn sẽ thay thế gì some_smart_ptr giữ chỗ với?

Câu trả lời chung, shared_ptr, chỉ đáng giá nếu quyền sở hữu thực sự được chia sẻ, nếu chức năng cấp cho người gọi quyền sở hữu độc quyền tài nguyên, nó gây hiểu lầm tốt nhất (và trường hợp điển hình của bi quan sớm như tôi liên quan).

Mặt khác, trong C++ 03, không có dạng con trỏ thông minh nào khác có thể phân phối: không thể, không có ngữ nghĩa di chuyển, để cung cấp những gì chúng tôi muốn ở đây. auto_ptr hoặc một con trỏ khỏa thân là hai ứng cử viên hợp lý. Nhưng sau đó một con trỏ khỏa thân cho bạn thấy nguy cơ rò rỉ nếu người gọi là bất cẩn.

Với C++ 0x, unique_ptr thay thế thuận lợi auto_ptr trong mọi tình huống.