ตัวสร้างของunique_ptr<T>
ยอมรับตัวชี้ดิบไปยังวัตถุประเภทT
(ดังนั้นจึงยอมรับ aT*
)
ในตัวอย่างแรก:
unique_ptr<int> uptr (new int(3));
ตัวชี้เป็นผลลัพธ์ของnew
นิพจน์ในขณะที่อยู่ในตัวอย่างที่สอง:
unique_ptr<double> uptr2 (pd);
ตัวชี้จะถูกเก็บไว้ในไฟล์ pd
ตัวแปร
ตามแนวคิดแล้วไม่มีอะไรเปลี่ยนแปลง (คุณกำลังสร้างunique_ptr
ตัวชี้ดิบ) แต่แนวทางที่สองอาจเป็นอันตรายมากกว่าเนื่องจากจะทำให้คุณสามารถทำสิ่งต่อไปนี้ได้
unique_ptr<double> uptr2 (pd);
unique_ptr<double> uptr3 (pd);
ดังนั้นจึงมีพอยน์เตอร์ที่ไม่ซ้ำกันสองตัวที่ห่อหุ้มวัตถุเดียวกันได้อย่างมีประสิทธิภาพ (ซึ่งเป็นการละเมิดความหมายของตัวชี้ที่ไม่ซ้ำกัน )
นี่คือเหตุผลที่รูปแบบแรกในการสร้างตัวชี้ที่ไม่ซ้ำกันจึงดีกว่าเมื่อเป็นไปได้ สังเกตว่าใน C ++ 14 เราจะสามารถทำ:
unique_ptr<int> p = make_unique<int>(42);
ซึ่งทั้งชัดเจนและปลอดภัยกว่า. ตอนนี้เกี่ยวกับข้อสงสัยของคุณ:
สิ่งที่ยังไม่ชัดเจนสำหรับฉันคือตัวชี้ที่ประกาศในลักษณะนี้จะแตกต่างจากตัวชี้ที่ประกาศในลักษณะ "ปกติ" อย่างไร
ตัวชี้สมาร์ทควรจะจำลองความเป็นเจ้าของวัตถุและดูแลการทำลายวัตถุปลายแหลมโดยอัตโนมัติเมื่อตัวชี้สุดท้าย (ฉลาดเป็นเจ้าของ) ไปยังวัตถุนั้นหลุดออกจากขอบเขต
ด้วยวิธีนี้คุณไม่ต้องจำไว้ว่าทำdelete
กับวัตถุที่จัดสรรแบบไดนามิก - ตัวทำลายของตัวชี้อัจฉริยะจะทำสิ่งนั้นให้คุณ - และไม่ต้องกังวลว่าคุณจะไม่ลดทอนตัวชี้ (ห้อย) ไปยังวัตถุที่ถูกทำลายไปแล้วหรือไม่:
{
unique_ptr<int> p = make_unique<int>(42);
}
ตอนนี้unique_ptr
เป็นตัวชี้อัจฉริยะที่จำลองการเป็นเจ้าของที่ไม่ซ้ำกันซึ่งหมายความว่าเมื่อใดก็ตามในโปรแกรมของคุณจะมีตัวชี้เพียงตัวเดียว (เป็นเจ้าของ) ไปยังวัตถุปลายแหลมนั่นคือเหตุผลว่าทำไมunique_ptr
ไม่ copyable
ตราบใดที่คุณใช้สมาร์ทพอยน์เตอร์ในลักษณะที่ไม่ผิดสัญญาโดยปริยายที่กำหนดให้คุณต้องปฏิบัติตามคุณจะรับประกันได้ว่าจะไม่มีการรั่วไหลของหน่วยความจำและนโยบายความเป็นเจ้าของที่เหมาะสมสำหรับวัตถุของคุณจะถูกบังคับใช้ ตัวชี้ดิบไม่ให้การรับประกันนี้แก่คุณ
new int(3)
กลับชี้ไปที่ใหม่int
เช่นเดียวกับเป็นตัวชี้ไปอยู่ที่ใหม่pd
double