อาจมีหลายเหตุผล ในการแสดงรายการไม่กี่รายการ:
- พอยน์เตอร์อัจฉริยะกลายเป็นส่วนหนึ่งของมาตรฐานเมื่อเร็ว ๆ นี้ จนกระทั่งพวกเขาเป็นส่วนหนึ่งของห้องสมุดอื่น ๆ
- การใช้งานหลักคือหลีกเลี่ยงการรั่วไหลของหน่วยความจำ ห้องสมุดหลายแห่งไม่มีการจัดการหน่วยความจำของตนเอง โดยทั่วไปแล้วพวกเขามีสาธารณูปโภคและ API
- พวกเขาถูกนำมาใช้เป็นเสื้อคลุมเนื่องจากเป็นจริงวัตถุและไม่ชี้ ซึ่งมีเวลาเพิ่มเติม / พื้นที่ค่าใช้จ่ายเมื่อเทียบกับตัวชี้ดิบ ผู้ใช้ห้องสมุดอาจไม่ต้องการมีค่าใช้จ่ายดังกล่าว
แก้ไข : การใช้ตัวชี้อัจฉริยะเป็นตัวเลือกของนักพัฒนาอย่างสมบูรณ์ มันขึ้นอยู่กับปัจจัยต่าง ๆ
ในระบบที่มีความสำคัญต่อประสิทธิภาพคุณอาจไม่ต้องการใช้พอยน์เตอร์อัจฉริยะที่สร้างค่าใช้จ่าย
โครงการที่ต้องการความเข้ากันได้แบบย้อนหลังคุณอาจไม่ต้องการใช้ตัวชี้สมาร์ทที่มีคุณสมบัติเฉพาะ C ++ 11
Edit2มีสตริงของ downvotes หลายรายการในช่วงเวลา 24 ชั่วโมงเนื่องจากทางด้านล่าง ฉันล้มเหลวที่จะเข้าใจว่าทำไมคำตอบคือ downvoted แม้ว่าด้านล่างเป็นเพียงคำแนะนำเพิ่มเติมและไม่ใช่คำตอบ
อย่างไรก็ตาม C ++ ช่วยให้คุณเปิดตัวเลือกได้เสมอ :) เช่น
template<typename T>
struct Pointer {
#ifdef <Cpp11>
typedef std::unique_ptr<T> type;
#else
typedef T* type;
#endif
};
และในรหัสของคุณใช้มันเป็น:
Pointer<int>::type p;
สำหรับผู้ที่กล่าวว่าตัวชี้สมาร์ทและตัวชี้แบบดิบนั้นแตกต่างกันฉันเห็นด้วยกับสิ่งนั้น โค้ดด้านบนเป็นเพียงความคิดที่ว่าใครสามารถเขียนโค้ดที่สามารถใช้แทนกันได้กับ a #define
นี่ไม่ใช่การบังคับ ;
ตัวอย่างเช่นT*
จะต้องลบอย่างชัดเจน แต่ตัวชี้สมาร์ทไม่ได้ เราสามารถสร้างเทมเพลตDestroy()
เพื่อจัดการกับมันได้
template<typename T>
void Destroy (T* p)
{
delete p;
}
template<typename T>
void Destroy (std::unique_ptr<T> p)
{
// do nothing
}
และใช้เป็น:
Destroy(p);
ในทำนองเดียวกันสำหรับตัวชี้ดิบเราสามารถคัดลอกโดยตรงและสำหรับตัวชี้สมาร์ทเราสามารถใช้การดำเนินการพิเศษ
Pointer<X>::type p = new X;
Pointer<X>::type p2(Assign(p));
อยู่ที่ไหนAssign()
:
template<typename T>
T* Assign (T *p)
{
return p;
}
template<typename T>
... Assign (SmartPointer<T> &p)
{
// use move sematics or whateve appropriate
}