2010-09-01 33 views
5

Bên cạnh tất cả các lợi ích đã biết của việc sử dụng auto_ptrs, auto_ptr là "thực hành tồi tệ nhất" là gì?auto_ptr Bẫy và Cạm bẫy

  1. Tạo bộ lọc STL của auto_ptrs. auto_ptrs không đáp ứng yêu cầu 'CopyConstructable'. Xem thêm “Hiệu quả STL” của Scott Meyer, mục 8.

  2. Tạo auto_ptrs của mảng Sau khi hủy, lệnh hủy auto_ptr sử dụng 'xóa' (và không bao giờ 'xóa []') để tiêu diệt đối tượng sở hữu, vì vậy mã này mang lại hành vi không xác định: auto_ptr api (int mới [42]);

  3. Không chăm sóc copy-ctor và op = trong lớp sử dụng thành viên auto_ptr. Người ta có thể ngây thơ nghĩ rằng bằng cách sử dụng các thành viên auto_ptr, người ta không cần triển khai toán tử tạo/gán bản sao cho một lớp. Tuy nhiên, ngay cả một thành viên auto_ptr 'độc tố' một lớp (i. E. Vi phạm các yêu cầu 'CopyConstructable' và 'Assignable'). Các đối tượng của các lớp như vậy sẽ bị hư hại một phần trong quá trình sao chép/chuyển nhượng.

Thậm chí còn có nhiều cạm bẫy auto_ptr nữa không?

+0

Ngoài ra, 'auto_ptr' sẽ không được chấp nhận trong tiêu chuẩn C++ tiếp theo (mà Sutter hy vọng sẽ được chính thức bình chọn sau tháng 3 năm 2011 (http://herbsutter.com/2010/08/28/trip-report-august-2010) -iso-c-standards-meeting /), do đó trở thành C++ 0B cho chúng ta chết-hards). Nếu bạn đã có 'unique_ptr', hãy sử dụng nó. –

Trả lời

6

Không chắc nếu đây là một cái bẫy/cạm bẫy, nhưng nó chắc chắn ít hơn rõ ràng:

  • Một const auto_ptr không thể có quyền sở hữu của con trỏ chứa chuyển

Nói cách khác:

const auto_ptr<Foo> ap(new Foo()); 
auto_ptr<Foo> ap2; 

ap2 = ap; // Not legal! 

Đây thực tế là khá hữu ích nếu bạn muốn tham số auto_ptr và gu arantee rằng bạn sẽ không được quyền sở hữu con trỏ chứa, nhưng nó cũng có thể đáng ngạc nhiên nếu bạn mong đợi một const auto_ptr<Foo> để cư xử như một Foo const*.

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