Có thể có nhiều lý do. Để liệt kê một vài trong số họ:
- Con trỏ thông minh đã trở thành một phần của tiêu chuẩn chỉ gần đây. Cho đến khi họ là một phần của các thư viện khác
- Công dụng chính của chúng là tránh rò rỉ bộ nhớ; nhiều thư viện không có quản lý bộ nhớ riêng; Nói chung, họ cung cấp các tiện ích và API
- Chúng được thực hiện như là trình bao bọc, vì chúng thực sự là các đối tượng và không phải là con trỏ. Mà có thêm chi phí thời gian / không gian, so với con trỏ thô; Người dùng của các thư viện có thể không muốn có các chi phí như vậy
Chỉnh sửa : Sử dụng con trỏ thông minh là sự lựa chọn hoàn toàn của nhà phát triển. Nó phụ thuộc vào các yếu tố khác nhau.
Trong các hệ thống quan trọng về hiệu năng, bạn có thể không muốn sử dụng các con trỏ thông minh tạo ra chi phí chung
Dự án cần khả năng tương thích ngược, bạn có thể không muốn sử dụng các con trỏ thông minh có các tính năng cụ thể của C ++ 11
Edit2 Có một chuỗi gồm nhiều downvote trong khoảng 24 giờ vì đoạn dưới đây. Tôi không hiểu tại sao câu trả lời bị bỏ qua mặc dù bên dưới chỉ là một gợi ý bổ trợ chứ không phải là câu trả lời.
Tuy nhiên, C ++ luôn tạo điều kiện cho bạn mở các tùy chọn. :) ví dụ
template<typename T>
struct Pointer {
#ifdef <Cpp11>
typedef std::unique_ptr<T> type;
#else
typedef T* type;
#endif
};
Và trong mã của bạn sử dụng nó như:
Pointer<int>::type p;
Đối với những người nói rằng một con trỏ thông minh và một con trỏ thô là khác nhau, tôi đồng ý với điều đó. Đoạn mã trên chỉ là một ý tưởng trong đó người ta có thể viết một mã có thể hoán đổi cho nhau chỉ với một #define
, đây không phải là bắt buộc ;
Ví dụ, T*
phải được xóa một cách rõ ràng nhưng một con trỏ thông minh thì không. Chúng ta có thể có một templated Destroy()
để xử lý đó.
template<typename T>
void Destroy (T* p)
{
delete p;
}
template<typename T>
void Destroy (std::unique_ptr<T> p)
{
// do nothing
}
và sử dụng nó như:
Destroy(p);
Theo cách tương tự, đối với một con trỏ thô, chúng ta có thể sao chép nó trực tiếp và đối với con trỏ thông minh, chúng ta có thể sử dụng thao tác đặc biệt.
Pointer<X>::type p = new X;
Pointer<X>::type p2(Assign(p));
Trong trường hợp Assign()
là như sau:
template<typename T>
T* Assign (T *p)
{
return p;
}
template<typename T>
... Assign (SmartPointer<T> &p)
{
// use move sematics or whateve appropriate
}