โลกที่ Bjarne อาศัยอยู่นั้นเป็น ... วิชาการเพื่อความต้องการในระยะที่ดีกว่า หากรหัสของคุณสามารถออกแบบและวางโครงสร้างให้วัตถุมีความสัมพันธ์เชิงลำดับชั้นสูงมากเช่นความสัมพันธ์ของการเป็นเจ้าของนั้นเข้มงวดและไม่ยอมให้รหัสไหลในทิศทางเดียว (จากระดับสูงถึงระดับต่ำ) และวัตถุจะพูดกับสิ่งที่ต่ำกว่า shared_ptr
ลำดับชั้นแล้วคุณจะไม่พบความจำเป็นมากสำหรับการ มันเป็นสิ่งที่คุณใช้ในโอกาสที่หายากเหล่านั้นซึ่งบางคนต้องฝ่าฝืนกฎ แต่มิฉะนั้นคุณสามารถติดทุกอย่างในvector
s หรือโครงสร้างข้อมูลอื่น ๆ ที่ใช้ semantics ค่าและunique_ptr
s สำหรับสิ่งที่คุณต้องจัดสรรโดยลำพัง
ในขณะที่โลกที่ยิ่งใหญ่ที่จะมีชีวิตอยู่มันไม่ใช่สิ่งที่คุณจะทำตลอดเวลา หากคุณไม่สามารถจัดระเบียบโค้ดของคุณได้เนื่องจากการออกแบบระบบที่คุณพยายามทำหมายความว่ามันเป็นไปไม่ได้ (หรือเพียงแค่ไม่เป็นที่น่าพอใจอย่างยิ่ง) คุณจะพบว่าตัวเองต้องการความเป็นเจ้าของร่วมกันของวัตถุมากขึ้นเรื่อย ๆ .
ในระบบเช่นนี้การถือพอยน์เตอร์พอยต์คือ ... ไม่อันตรายอย่างแน่นอน แต่มันทำให้เกิดคำถาม สิ่งที่ดีเกี่ยวกับshared_ptr
มันคือการให้การรับประกันทางวากยสัมพันธ์ที่สมเหตุสมผลเกี่ยวกับอายุการใช้งานของวัตถุ มันหักได้ไหม? แน่นอน. แต่ผู้คนยังสามารถทำconst_cast
สิ่งต่าง ๆ ; การดูแลขั้นพื้นฐานและการให้อาหารshared_ptr
ควรมีคุณภาพชีวิตที่เหมาะสมสำหรับวัตถุที่ได้รับการจัดสรรซึ่งต้องมีการแบ่งปันความเป็นเจ้าของ
แล้วมีweak_ptr
s shared_ptr
ซึ่งไม่สามารถนำมาใช้ในกรณีที่ไม่มีการ หากระบบของคุณมีโครงสร้างที่แน่นหนาคุณสามารถเก็บตัวชี้เปล่าไปยังวัตถุบางอย่างได้อย่างปลอดภัยในความรู้ที่ว่าโครงสร้างของแอปพลิเคชันทำให้มั่นใจได้ว่าวัตถุที่ชี้ไปนั้นจะอยู่ได้นานกว่าคุณ คุณสามารถเรียกใช้ฟังก์ชันที่ส่งกลับตัวชี้ไปยังค่าภายในหรือภายนอกบางอย่าง (ค้นหาวัตถุชื่อ X เป็นต้น) ในรหัสที่มีโครงสร้างอย่างถูกต้องฟังก์ชันนั้นจะมีให้เฉพาะคุณเท่านั้นหากอายุการใช้งานของวัตถุนั้นเกินกว่าที่คุณกำหนดไว้ ดังนั้นการเก็บตัวชี้เปล่าไว้ในวัตถุของคุณจึงเป็นเรื่องปกติ
เนื่องจากความแข็งแกร่งนั้นไม่สามารถทำได้ในระบบจริงเสมอไปคุณจึงต้องมีวิธีที่จะรับประกันอายุการใช้งานอย่างสมเหตุสมผล บางครั้งคุณไม่ต้องการความเป็นเจ้าของอย่างเต็มที่ บางครั้งคุณต้องรู้ว่าเมื่อตัวชี้ไม่ดีหรือดี นั่นคือที่weak_ptr
มาใน. มีกรณีที่ผมจะได้ใช้unique_ptr
หรือboost::scoped_ptr
แต่ผมต้องใช้shared_ptr
เพราะผมโดยเฉพาะต้องการให้ใครสักคน "ผันผวน" ชี้ ตัวชี้ที่อายุการใช้งานไม่แน่นอนและพวกเขาสามารถสอบถามเมื่อตัวชี้นั้นถูกทำลาย
วิธีที่ปลอดภัยเพื่อความอยู่รอดเมื่อสภาวะของโลกไม่แน่นอน
นั่นอาจจะเกิดจากการเรียกฟังก์ชั่นบางอย่างเพื่อรับพอยน์เตอร์แทนที่จะใช้ผ่านweak_ptr
? ใช่ แต่นั่นอาจถูกทำลายได้ง่ายขึ้น ฟังก์ชั่นที่ส่งกลับตัวชี้เปล่านั้นไม่มีวิธีการแนะนำทางวากยสัมพันธ์ว่าผู้ใช้ไม่ได้ทำอะไรบางอย่างเช่นการจัดเก็บตัวชี้นั้นในระยะยาว การคืนค่า a shared_ptr
ทำให้ง่ายเกินไปสำหรับใครบางคนที่จะเก็บมันไว้และอาจยืดอายุการใช้งานของวัตถุ การย้อนกลับมาweak_ptr
ขอแนะนำอย่างยิ่งว่าการเก็บข้อมูลที่shared_ptr
คุณได้รับlock
นั้นเป็น ... ความคิดที่น่าสงสัย มันจะไม่หยุดคุณจากการทำ แต่ไม่มีอะไรใน C ++ ที่จะหยุดคุณจากการทำลายรหัส weak_ptr
ให้ความต้านทานน้อยที่สุดจากการทำสิ่งที่เป็นธรรมชาติ
ตอนนี้ที่ไม่ได้บอกว่าshared_ptr
ไม่สามารถจะตื้อ ; มันสามารถ โดยเฉพาะอย่างยิ่งก่อนunique_ptr
มีหลายกรณีที่ฉันเพิ่งใช้boost::shared_ptr
เพราะฉันต้องผ่านตัวชี้ RAII รอบ ๆ หรือใส่ไว้ในรายการ โดยไม่ต้องย้ายความหมายและunique_ptr
, boost::shared_ptr
เป็นทางออกที่แท้จริงเท่านั้น
และคุณสามารถใช้ในสถานที่ที่ค่อนข้างไม่จำเป็น shared_ptr
ตามที่ระบุไว้ข้างต้นโครงสร้างรหัสที่เหมาะสมสามารถขจัดความจำเป็นในการใช้งานของบางคน แต่ถ้าระบบของคุณไม่สามารถจัดโครงสร้างได้เช่นนั้นและยังคงทำสิ่งที่จำเป็นต้องใช้shared_ptr
ก็จะเป็นการใช้งานที่สำคัญ