ทำไมตัวชี้สมาร์ทที่มีการอ้างอิงจำนวนมากถึงได้รับความนิยม?


52

อย่างที่ฉันเห็นตัวชี้สมาร์ทถูกใช้อย่างกว้างขวางในโครงการ C ++ ในโลกแห่งความเป็นจริง

แม้ว่าพอยน์เตอร์อัจฉริยะบางประเภทจะมีประโยชน์ในการสนับสนุน RAII และการถ่ายโอนความเป็นเจ้าของ แต่ก็มีแนวโน้มที่จะใช้พอยน์เตอร์ที่ใช้ร่วมกันตามค่าเริ่มต้นเป็นวิธีการ"เก็บขยะ"เพื่อให้โปรแกรมเมอร์ไม่ต้องคิดถึงการจัดสรรมาก .

ทำไมตัวชี้ที่ใช้ร่วมกันรับความนิยมมากกว่าการบูรณาการเก็บขยะที่เหมาะสมเช่นBoehm GC ? (หรือคุณเห็นด้วยเลยว่ามันได้รับความนิยมมากกว่า GCs จริงหรือไม่)

ฉันรู้เกี่ยวกับข้อดีสองประการของ GCs ทั่วไปมากกว่าการนับการอ้างอิง:

  • ขั้นตอนวิธี GC ธรรมดาไม่มีปัญหากับการอ้างอิงรอบ
  • การนับการอ้างอิงโดยทั่วไปจะช้ากว่า GC ที่เหมาะสม

อะไรคือสาเหตุของการใช้ตัวชี้สมาร์ทนับการอ้างอิง?


6
ฉันเพียงแค่เพิ่มความคิดเห็นว่านี่เป็นค่าเริ่มต้นที่ไม่ถูกต้องในการใช้งาน: ในกรณีส่วนใหญ่std::unique_ptrมีความเพียงพอและเป็นเช่นนั้นมีค่าใช้จ่ายเป็นศูนย์เหนือพอยน์เตอร์ดิบในแง่ของประสิทธิภาพเวลาทำงาน เมื่อใช้std::shared_ptrทุกที่คุณจะต้องปิดบังความหมายของการเป็นเจ้าของทำให้สูญเสียหนึ่งในผลประโยชน์ที่สำคัญของตัวชี้สมาร์ทนอกเหนือจากการจัดการทรัพยากรอัตโนมัติ - ทำความเข้าใจเกี่ยวกับเจตนาที่อยู่เบื้องหลังรหัส
แมตต์

2
ขออภัยคำตอบที่ยอมรับได้ที่นี่ผิด การนับการอ้างอิงมีค่าโสหุ้ยสูงกว่า (การนับแทนเครื่องหมายบิตและประสิทธิภาพการทำงานที่ช้าลง), เวลาหยุดที่ไม่ได้ จำกัด ไว้เมื่อการลดลงของหิมะถล่มและไม่มีความซับซ้อนเพิ่มขึ้นอีก
Jon Harrop

คำตอบ:


57

ข้อดีบางประการของการอ้างอิงนับมากกว่าการรวบรวมขยะ:

  1. ค่าใช้จ่ายต่ำ นักสะสมขยะอาจล่วงล้ำ (เช่นทำให้โปรแกรมของคุณค้างในเวลาที่คาดเดาไม่ได้ในขณะที่กระบวนการวนรอบการรวบรวมขยะ) และหน่วยความจำค่อนข้างมาก (เช่นรอยเท้าหน่วยความจำของกระบวนการของคุณเติบโตขึ้นเป็นเมกะไบต์โดยไม่จำเป็น

  2. พฤติกรรมที่คาดการณ์ได้มากขึ้น ด้วยการนับการอ้างอิงคุณจะรับประกันได้ว่าวัตถุของคุณจะถูกปลดปล่อยทันทีที่การอ้างอิงครั้งสุดท้ายหายไป ด้วยการเก็บขยะในทางกลับกันวัตถุของคุณจะถูกปล่อยเป็น "บางครั้ง" เมื่อระบบเข้าสู่รอบ สำหรับ RAM นี่ไม่ใช่ปัญหาใหญ่บนเดสก์ท็อปหรือเซิร์ฟเวอร์ที่โหลดน้อย แต่สำหรับทรัพยากรอื่น ๆ (เช่นการจัดการไฟล์) คุณมักจะต้องปิด ASAP เพื่อหลีกเลี่ยงความขัดแย้งที่อาจเกิดขึ้นในภายหลัง

  3. ที่เรียบง่าย สามารถอธิบายการนับการอ้างอิงในไม่กี่นาทีและนำไปใช้ในหนึ่งหรือสองชั่วโมง นักสะสมขยะโดยเฉพาะที่มีประสิทธิภาพเหมาะสมมีความซับซ้อนอย่างมากและมีคนไม่มากนักที่เข้าใจพวกเขา

  4. มาตรฐาน. C ++ รวมถึงการนับการอ้างอิง (ผ่าน shared_ptr) และเพื่อน ๆ ใน STL ซึ่งหมายความว่าโปรแกรมเมอร์ C ++ ส่วนใหญ่คุ้นเคยกับมันและรหัส C ++ ส่วนใหญ่จะใช้งานได้ ไม่มีตัวรวบรวมขยะ C ++ มาตรฐานใด ๆ ซึ่งหมายความว่าคุณต้องเลือกอย่างใดอย่างหนึ่งและหวังว่ามันจะทำงานได้ดีสำหรับกรณีการใช้งานของคุณ - และหากไม่เป็นเช่นนั้นก็เป็นปัญหาของคุณที่จะต้องแก้ไขไม่ใช่ภาษา

สำหรับข้อเสียที่ถูกกล่าวหาของการนับการอ้างอิง - การไม่ตรวจจับรอบเป็นปัญหา แต่สิ่งหนึ่งที่ฉันไม่เคยพบเจอเป็นการส่วนตัวในช่วงสิบปีที่ผ่านมาของการใช้การนับการอ้างอิง โครงสร้างข้อมูลส่วนใหญ่เป็นวัฏจักรตามธรรมชาติและถ้าคุณเจอสถานการณ์ที่คุณต้องการการอ้างอิงแบบวัฏจักร (เช่นตัวชี้พาเรนต์ในโหนดทรี) คุณสามารถใช้จุดอ่อนหรือตัวชี้ C ดิบสำหรับ "ทิศทางย้อนกลับ" ตราบใดที่คุณตระหนักถึงปัญหาที่อาจเกิดขึ้นเมื่อคุณออกแบบโครงสร้างข้อมูลของคุณมันก็ไม่ใช่ปัญหา

สำหรับประสิทธิภาพฉันไม่เคยมีปัญหากับประสิทธิภาพการนับการอ้างอิง ฉันมีปัญหาเกี่ยวกับประสิทธิภาพของการรวบรวมขยะโดยเฉพาะอย่างยิ่งการสุ่มแช่แข็งที่ GC สามารถเกิดขึ้นได้ซึ่งวิธีแก้ปัญหาเดียว ("ไม่จัดสรรวัตถุ") อาจได้รับการแนะนำใหม่เป็น "อย่าใช้ GC" .


16
ไร้เดียงสาการใช้งานอ้างอิงนับมักจะได้รับมากผ่านต่ำกว่า GCs ผลิต (30-40%) ค่าใช้จ่ายของแฝง สามารถปิดช่องว่างด้วยการปรับให้เหมาะสมเช่นการใช้บิตน้อยลงสำหรับ refcount และหลีกเลี่ยงการติดตามวัตถุจนกว่าวัตถุเหล่านั้นจะหลบหนี - C ++ ทำเช่นนี้ได้ตามปกติถ้าคุณmake_sharedกลับมาเป็นหลัก อย่างไรก็ตามเวลาแฝงมีแนวโน้มที่จะเป็นปัญหาที่ใหญ่กว่าในแอปพลิเคชันแบบเรียลไทม์ แต่ปริมาณงานมีความสำคัญมากกว่าโดยทั่วไปซึ่งเป็นสาเหตุที่การติดตาม GCs ถูกนำมาใช้อย่างกว้างขวาง ฉันจะไม่พูดเร็ว ๆ
จอน Purdy

3
ฉันจะพูดคลุมเครือ 'เรียบง่าย': เรียบง่ายขึ้นในแง่ของจำนวนการใช้งานทั้งหมดที่จำเป็นใช่ แต่ไม่ใช่ง่ายกว่าสำหรับรหัสที่ใช้ : เปรียบเทียบบอกคนวิธีใช้ RC ('ทำสิ่งนี้เมื่อสร้างวัตถุและสิ่งนี้เมื่อทำลายพวกเขา' ) ถึงวิธี (ไร้เดียงสาซึ่งบ่อยครั้ง) ใช้ GC ('... ')
AakashM

4
"ด้วยการนับการอ้างอิงคุณจะรับประกันได้ว่าวัตถุของคุณจะถูกปลดปล่อยทันทีที่การอ้างอิงครั้งสุดท้ายหายไป" นั่นคือความเข้าใจผิดที่พบบ่อย flyingfrogblog.blogspot.co.uk/2013/10/…
Jon Harrop

4
@ JonHarrop: บล็อกโพสต์นั้นผิดอย่างน่ากลัว คุณควรอ่านความคิดเห็นทั้งหมดโดยเฉพาะความคิดเห็นสุดท้าย
Deduplicator

3
@ JonHarrop: ใช่มี เขาไม่เข้าใจว่าอายุการใช้งานเป็นขอบเขตเต็มซึ่งขึ้นอยู่กับวงเล็บปิด และการปรับให้เหมาะสมใน F # ซึ่งตามความเห็นบางครั้งการทำงานจะสิ้นสุดอายุการใช้งานก่อนหน้านี้หากตัวแปรไม่ได้ใช้อีก ซึ่งโดยธรรมชาติมีภัยของตัวเอง
Deduplicator

26

เพื่อให้ได้ประสิทธิภาพที่ดีจาก GC นั้น GC จำเป็นต้องสามารถย้ายวัตถุในหน่วยความจำ ในภาษาเช่น C ++ ที่คุณสามารถโต้ตอบโดยตรงกับตำแหน่งหน่วยความจำนี่เป็นไปไม่ได้เลยทีเดียว (Microsoft C ++ / CLR จะไม่นับเพราะแนะนำไวยากรณ์ใหม่สำหรับพอยน์เตอร์ที่มีการจัดการโดย GC ดังนั้นจึงเป็นภาษาอื่นที่มีประสิทธิภาพ)

Boehm GC ในขณะที่ความคิดที่ดีเป็นจริงที่เลวร้ายที่สุดของโลกทั้งสอง: คุณต้อง malloc () ที่ช้ากว่า GC ที่ดีและดังนั้นคุณจะสูญเสียพฤติกรรมการจัดสรร / จัดสรรคืนที่กำหนดโดยไม่มีการเพิ่มประสิทธิภาพที่สอดคล้องกันของ generational GC . นอกจากนี้ยังเป็นไปตามหลักความระมัดระวังดังนั้นจึงไม่จำเป็นต้องรวบรวมขยะทั้งหมดของคุณ

GC ที่ดีและได้รับการปรับแต่งนั้นสามารถเป็นสิ่งที่ยอดเยี่ยม แต่ในภาษาอย่าง C ++ กำไรจะน้อยที่สุดและค่าใช้จ่ายมักจะไม่คุ้มค่า

มันจะน่าสนใจที่จะเห็น แต่เมื่อ C ++ 11 เป็นที่นิยมมากขึ้นไม่ว่าจะเป็น lambdas และการจับความหมายเริ่มนำชุมชน C ++ ไปสู่การจัดสรรประเภทเดียวกันและปัญหาอายุการใช้งานของวัตถุที่ทำให้ชุมชน Lisp ประดิษฐ์ GCs ในครั้งแรก สถานที่.

ดูเพิ่มเติมคำตอบของฉันคำถามที่เกี่ยวข้องมากกว่าใน StackOverflow


6
RE the Boehm GC ฉันเคยสงสัยในบางครั้งว่าเป็นการส่วนตัวที่รับผิดชอบต่อความเกลียดชังดั้งเดิมของ GC ในหมู่โปรแกรมเมอร์ C และ C ++ เพียงแค่ให้ความประทับใจแรกที่ไม่ดีของเทคโนโลยีโดยทั่วไป
Leushenko

@Lushushenko พูดได้ดี กรณีในประเด็นคือคำถามนี้ที่ Boehm gc เรียกว่า "เหมาะสม" gc โดยไม่สนใจข้อเท็จจริงที่ว่ามันช้าและรับประกันการรั่วไหลจริง ฉันพบคำถามนี้ในขณะที่ค้นคว้าว่ามีคนใช้วงจรตัวแบ่งสไตล์หลามสำหรับ shared_ptr ซึ่งฟังดูเป็นเป้าหมายที่คุ้มค่าสำหรับการใช้งาน c ++ หรือไม่
user4815162342

4

อย่างที่ฉันเห็นตัวชี้สมาร์ทถูกใช้อย่างกว้างขวางในโครงการ C ++ ในโลกแห่งความเป็นจริง

จริงอยู่ แต่โดยส่วนใหญ่แล้วโค้ดส่วนใหญ่ได้ถูกเขียนขึ้นในภาษาที่ทันสมัยพร้อมกับการติดตามตัวรวบรวมขยะ

แม้ว่าพอยน์เตอร์อัจฉริยะบางประเภทจะมีประโยชน์ในการสนับสนุน RAII และการถ่ายโอนความเป็นเจ้าของ แต่ก็มีแนวโน้มที่จะใช้พอยน์เตอร์ที่ใช้ร่วมกันตามค่าเริ่มต้นเป็นวิธีการ "เก็บขยะ" เพื่อให้โปรแกรมเมอร์ไม่ต้องคิดถึงการจัดสรรมาก .

นั่นเป็นความคิดที่ไม่ดีเพราะคุณยังต้องกังวลกับวงจร

ทำไมพอยน์เตอร์ที่ใช้ร่วมกันจึงได้รับความนิยมมากกว่าการรวมตัวรวบรวมขยะที่เหมาะสมเช่น Boehm GC (หรือคุณเห็นด้วยเลยว่ามันได้รับความนิยมมากกว่า GCs จริงหรือไม่)

โอ้ว้าวมีหลายสิ่งที่คุณคิดผิด:

  1. Boehm's GC ไม่ใช่ GC ที่ "เหมาะสม" ในแง่ของคำศัพท์ มันช่างน่ากลัวจริงๆ มันเป็นแบบอนุรักษ์นิยมดังนั้นจึงรั่วไหลและไม่มีประสิทธิภาพโดยการออกแบบ ดู: http://flyingfrogblog.blogspot.co.uk/search/label/boehm

  2. พอยน์เตอร์ที่ใช้ร่วมกันนั้นไม่มีความใกล้เคียงกับความนิยมเท่าที่ GC เพราะนักพัฒนาส่วนใหญ่ใช้ภาษา GC'd ในขณะนี้และไม่ต้องการพอยน์เตอร์ที่ใช้ร่วมกัน เพียงดูที่ Java และ Javascript ในตลาดงานเปรียบเทียบกับ C ++

  3. ดูเหมือนว่าคุณจะถูก จำกัด การพิจารณาให้กับ C ++ เพราะฉันคิดว่าคุณคิดว่า GC เป็นปัญหาทางสัมผัส มันไม่ใช่ ( วิธีเดียวที่จะได้ GC ที่เหมาะสมคือการออกแบบภาษาและ VM ตั้งแต่ต้น) ดังนั้นคุณจึงแนะนำอคติการเลือก ผู้ที่ต้องการการเก็บขยะที่เหมาะสมไม่ติดกับ C ++

อะไรคือสาเหตุของการใช้ตัวชี้สมาร์ทนับการอ้างอิง?

คุณถูก จำกัด ไว้ที่ C ++ แต่หวังว่าคุณจะมีการจัดการหน่วยความจำอัตโนมัติ


7
อืม, มันเป็นคำถามที่ติดแท็กc ++ซึ่งพูดถึงคุณสมบัติของ C ++ เห็นได้ชัดว่าข้อความทั่วไปใด ๆ ที่พูดถึงภายในรหัส C ++ ไม่ใช่การเขียนโปรแกรมทั้งหมด ดังนั้นอย่างไรก็ตามการเก็บขยะ "อย่างเป็นกลาง" อาจถูกนำไปใช้นอกโลก C ++ ซึ่งท้ายที่สุดแล้วไม่เกี่ยวข้องกับคำถามในมือ
Nicol Bolas

2
บรรทัดสุดท้ายของคุณผิดปกติอย่างชัดเจน: คุณอยู่ใน C ++ และดีใจที่คุณไม่ได้ถูกบังคับให้จัดการกับ GC และมันเป็นการปล่อยทรัพยากรออกล่าช้า มีเหตุผลที่ Apple ไม่ชอบ GC และแนวทางที่สำคัญที่สุดสำหรับภาษา GC'd คือ: อย่าสร้างขยะหากคุณไม่มีทรัพยากรที่ว่างเปล่าหรือไม่สามารถช่วยได้
Deduplicator

3
@JonHarrop: ดังนั้นเปรียบเทียบโปรแกรมขนาดเล็กที่เทียบเท่ากับและไม่มี GC ซึ่งไม่ได้เลือกอย่างชัดเจนในการเล่นเพื่อประโยชน์ของทั้งสองฝ่าย สิ่งใดที่คุณคาดหวังว่าต้องการหน่วยความจำเพิ่มเติม
Deduplicator

1
@Dupuplicator: ฉันสามารถมองเห็นโปรแกรมที่ให้ผลลัพธ์อย่างใดอย่างหนึ่ง การนับการอ้างอิงจะมีประสิทธิภาพสูงกว่าการติดตาม GC เมื่อโปรแกรมได้รับการออกแบบเพื่อให้ฮีปจัดสรรหน่วยความจำจนกว่าจะรอดชีวิตจากเรือนเพาะชำ (เช่นคิวของรายการ) เพราะนั่นคือประสิทธิภาพทางพยาธิวิทยาของ GC generational และจะสร้างขยะลอยมากที่สุด การติดตามการรวบรวมขยะจะต้องใช้หน่วยความจำน้อยกว่าการนับการอ้างอิงตามขอบเขตเมื่อมีวัตถุขนาดเล็กจำนวนมากและอายุการใช้งานสั้น แต่ไม่เป็นที่รู้จักกันดีในแบบคงที่ดังนั้นบางสิ่งบางอย่างเช่นโปรแกรมลอจิก
Jon Harrop

3
@ JonHarrop: ฉันหมายถึง GC (การติดตามหรืออะไรก็ตาม) และ RAII ถ้าคุณพูด C ++ ซึ่งรวมถึงการนับการอ้างอิง แต่เฉพาะในกรณีที่มีประโยชน์ หรือคุณสามารถเปรียบเทียบกับโปรแกรม Swift
Deduplicator

3

ใน MacOS X และ iOS และกับนักพัฒนาที่ใช้ Objective-C หรือ Swift การนับการอ้างอิงเป็นที่นิยมเนื่องจากมีการจัดการโดยอัตโนมัติและการใช้การรวบรวมขยะลดลงอย่างมากเนื่องจาก Apple ไม่รองรับอีกต่อไป (ฉันบอกว่าแอปที่ใช้ การรวบรวมขยะจะแตกในเวอร์ชัน MacOS X ถัดไปและการรวบรวมขยะไม่เคยนำมาใช้ใน iOS) ฉันสงสัยอย่างจริงจังจริง ๆ ว่ามีซอฟต์แวร์จำนวนมากที่เคยใช้การรวบรวมขยะเมื่อพร้อมใช้งาน

เหตุผลในการกำจัดการเก็บขยะ: มันไม่เคยทำงานได้อย่างน่าเชื่อถือในสภาพแวดล้อมแบบ C ที่ตัวชี้สามารถ "หลบหนี" ไปยังพื้นที่ที่ไม่สามารถเข้าถึงได้โดยตัวเก็บขยะ Apple เชื่อมั่นอย่างยิ่งและเชื่อว่าการนับการอ้างอิงนั้นเร็วกว่า (คุณสามารถอ้างสิทธิ์ได้ที่นี่เกี่ยวกับความเร็วสัมพัทธ์ แต่ไม่มีใครสามารถโน้มน้าวใจ Apple ได้) และในที่สุดไม่มีใครใช้การเก็บขยะ

สิ่งแรกที่นักพัฒนา MacOS X หรือ iOS เรียนรู้คือวิธีจัดการรอบการอ้างอิงดังนั้นจึงไม่ใช่ปัญหาสำหรับนักพัฒนาที่แท้จริง


วิธีที่ฉันเข้าใจไม่ใช่ว่ามันเป็นสภาพแวดล้อมแบบ C ซึ่งตัดสินใจเรื่องต่าง ๆ แต่ GC นั้นไม่แน่นอนและต้องการหน่วยความจำมากขึ้นเพื่อให้ได้ประสิทธิภาพที่ยอมรับได้และเซิร์ฟเวอร์ / เดสก์ท็อปนอกนั้นค่อนข้างหายากอยู่เสมอ
Deduplicator

การดีบักสาเหตุที่นักสะสมขยะทำลายวัตถุที่ฉันยังใช้อยู่ (นำไปสู่ความผิดพลาด) ตัดสินใจให้ฉัน :-)
gnasher729

โอ้ใช่นั่นจะทำเช่นกัน ในที่สุดคุณค้นพบว่าทำไม?
Deduplicator

ใช่มันเป็นหนึ่งในฟังก์ชั่น Unix จำนวนมากที่คุณผ่านโมฆะ * เป็น "บริบท" ซึ่งจะส่งกลับมาให้คุณในฟังก์ชันการเรียกกลับ โมฆะ * เป็นวัตถุ Object--C จริงๆและตัวเก็บขยะไม่ได้ตระหนักถึงวัตถุที่ถูกซ่อนอยู่ในการโทร Unix การโทรกลับถูกเรียกเป็นโมฆะ * เป็น Object *, kaboom!
gnasher729

2

ข้อเสียที่ใหญ่ที่สุดของการเก็บขยะใน C ++ คือว่ามันเป็นไปไม่ได้ที่จะได้รับ:

  • ใน C ++ พอยน์เตอร์ไม่ได้อาศัยอยู่ในชุมชนที่มีกำแพงล้อมรอบพวกเขาจะถูกนำไปผสมกับข้อมูลอื่น ดังนั้นคุณจึงไม่สามารถแยกตัวชี้จากข้อมูลอื่นที่เพิ่งเกิดขึ้นมีรูปแบบบิตที่สามารถตีความได้ว่าเป็นตัวชี้ที่ถูกต้อง

    ผลที่ตามมา: ตัวรวบรวมขยะ C ++ ใด ๆ จะรั่วไหลวัตถุที่ควรเก็บรวบรวม

  • ใน C ++ คุณสามารถทำเลขคณิตตัวชี้เพื่อให้ได้พอยน์เตอร์ ดังนั้นหากคุณไม่พบตัวชี้ไปยังจุดเริ่มต้นของบล็อกนั่นไม่ได้หมายความว่าบล็อกนั้นไม่สามารถอ้างอิงได้

    ผลที่ตามมา: ตัวรวบรวมขยะ C ++ ใด ๆ จะต้องทำการปรับเปลี่ยนเหล่านี้โดยคำนึงถึงลำดับบิตใด ๆ ที่เกิดขึ้นที่จุดใดก็ได้ภายในบล็อก

    หมายเหตุ: ตัวรวบรวมขยะ C ++ ไม่สามารถจัดการกับรหัสด้วยลูกเล่นเช่นนี้:

    int* array = new int[7];
    array--;    //undefined behavior, but people may be tempted anyway...
    for(int i = 1; i <= 7; i++) array[i] = i;

    จริงสิ่งนี้เรียกใช้พฤติกรรมที่ไม่ได้กำหนด แต่โค้ดที่มีอยู่บางตัวนั้นฉลาดกว่าดีสำหรับมันและมันอาจทริกเกอร์การจัดสรรคืนเบื้องต้นโดยตัวรวบรวมขยะ


2
" พวกเขาผสมกับข้อมูลอื่น ๆ " มันไม่มากจนพวกเขา "ผสม" กับข้อมูลอื่น ๆ ง่ายต่อการใช้ระบบประเภท C ++ เพื่อดูว่าตัวชี้คืออะไรและไม่ใช่อะไร ปัญหาคือตัวชี้กลายเป็นข้อมูลอื่นบ่อยครั้ง การซ่อนตัวชี้ในเลขจำนวนเต็มเป็นเครื่องมือที่น่าเสียดายสำหรับ API แบบ C หลายแบบ
Nicol Bolas

1
คุณไม่จำเป็นต้องมีพฤติกรรมที่ไม่ได้กำหนดเพื่อทำให้ตัวรวบรวมขยะใน c ++ ยกตัวอย่างเช่นคุณสามารถซีเรียลไลซ์พอยน์เตอร์ให้เป็นไฟล์และอ่านในภายหลัง ในขณะเดียวกันกระบวนการของคุณอาจไม่มีตัวชี้นั้นที่ใดก็ได้ในพื้นที่ที่อยู่ของมันดังนั้นตัวเก็บขยะสามารถรวบรวมวัตถุนั้นและเมื่อคุณ deserialize ตัวชี้ ... อ๊ะ
Bwmat

@Bwmat "Even"? กำลังเขียนพอยน์เตอร์ไปยังไฟล์เช่นที่ดูเหมือนว่า ... ไกลไปหน่อย อย่างไรก็ตามปัญหาร้ายแรงที่เหมือนกันพอยน์เตอร์ก็คือพอยต์เตอร์สแต็กวัตถุพวกมันอาจหายไปเมื่อคุณอ่านตัวชี้กลับมาจากไฟล์อื่น ๆ ในรหัส! การดีซีเรียลไลซ์ค่าตัวชี้ที่ไม่ถูกต้องเป็นพฤติกรรมที่ไม่ได้กำหนดอย่าทำเช่นนั้น
hyde

ถ้าแน่นอนคุณจะต้องระวังถ้าคุณทำอะไรแบบนั้น มันหมายถึงการเป็นตัวอย่างที่โดยทั่วไปเก็บขยะไม่สามารถทำงานได้ 'ถูกต้อง' ในทุกกรณีใน c ++ (โดยไม่ต้องเปลี่ยนภาษา) ความ
Bwmat

1
@ gnasher729: เอ๊ะหืม อดีตตัวชี้จะดีอย่างสมบูรณ์?
Deduplicator
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.