คำถามติดแท็ก raii


16
C ++ รองรับการบล็อก 'ที่สุด' หรือไม่? (และนี่คือ 'RAII' ที่ฉันคอยฟัง?)
C ++ รองรับการบล็อก ' ที่สุด ' หรือไม่? อะไรคือ สำนวน RAII ? อะไรคือความแตกต่างระหว่างคำสั่ง RAII ของ C ++ กับการใช้คำสั่ง 'C' ?
272 c++  exception  raii  finally  c++-faq 

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


5
ฉันต้องปิด ifstream ด้วยตนเองหรือไม่
ฉันต้องโทรด้วยตนเองclose()เมื่อใช้std::ifstreamหรือไม่ ตัวอย่างเช่นในรหัส: std::string readContentsOfFile(std::string fileName) { std::ifstream file(fileName.c_str()); if (file.good()) { std::stringstream buffer; buffer << file.rdbuf(); file.close(); return buffer.str(); } throw std::runtime_exception("file not found"); } ฉันต้องโทรfile.close()ด้วยตนเองหรือไม่ ไม่ควรifstreamใช้RAIIสำหรับการปิดไฟล์?
201 c++  ifstream  raii 

6
RAII และตัวชี้สมาร์ทใน C ++
ในทางปฏิบัติกับ C ++ RAIIคืออะไรพอยน์เตอร์อัจฉริยะคืออะไรสิ่งเหล่านี้นำไปใช้ในโปรแกรมได้อย่างไรและประโยชน์ของการใช้ RAII กับพอยน์เตอร์อัจฉริยะคืออะไร
193 c++  smart-pointers  raii 

29
หลักเกณฑ์ทั่วไปเพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำใน C ++ [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดขึ้นมาใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา มีเคล็ดลับทั่วไปอะไรบ้างเพื่อให้แน่ใจว่าหน่วยความจำในโปรแกรม C ++ ไม่รั่วไหล ฉันจะทราบได้อย่างไรว่าใครควรเพิ่มหน่วยความจำที่ได้รับการจัดสรรแบบไดนามิก

12
การใช้ IDisposable และ "ใช้" เป็นวิธีการในการรับ "พฤติกรรมที่กำหนดขอบเขต" เพื่อความปลอดภัยในทางที่ผิดหรือไม่
สิ่งที่ฉันมักใช้ใน C ++ คือการปล่อยให้คลาสAจัดการกับการเข้าสู่สถานะและเงื่อนไขการออกสำหรับคลาสอื่นBผ่านตัวAสร้างและตัวทำลายเพื่อให้แน่ใจว่าหากบางสิ่งในขอบเขตนั้นเกิดข้อยกเว้น B จะมีสถานะที่ทราบเมื่อ ออกจากขอบเขตแล้ว นี่ไม่ใช่ RAII ที่บริสุทธิ์เท่าที่ใช้ตัวย่อ แต่เป็นรูปแบบที่กำหนดไว้ ใน C # ฉันมักจะต้องการทำ class FrobbleManager { ... private void FiddleTheFrobble() { this.Frobble.Unlock(); Foo(); // Can throw this.Frobble.Fiddle(); // Can throw Bar(); // Can throw this.Frobble.Lock(); } } ซึ่งต้องทำแบบนี้ private void FiddleTheFrobble() { this.Frobble.Unlock(); try { Foo(); // Can …

11
การทำความเข้าใจความหมายของคำศัพท์และแนวคิด - RAII (Resource Acquisition is Initialization)
คุณช่วยนักพัฒนา C ++ ช่วยให้คำอธิบายที่ดีแก่เราได้ไหมว่า RAII คืออะไรทำไมจึงสำคัญและอาจมีความเกี่ยวข้องกับภาษาอื่นหรือไม่ ผมทำรู้นิด ๆ หน่อย ๆ ฉันเชื่อว่าย่อมาจาก "Resource Acquisition is Initialization" อย่างไรก็ตามชื่อนั้นไม่ได้ทำให้สับสนกับความเข้าใจ (อาจไม่ถูกต้อง) ของฉันเกี่ยวกับสิ่งที่ RAII คือ: ฉันรู้สึกว่า RAII เป็นวิธีเริ่มต้นวัตถุบนสแต็กดังนั้นเมื่อตัวแปรเหล่านั้นออกไปนอกขอบเขตผู้ทำลายจะโดยอัตโนมัติ เรียกว่าทำให้ทรัพยากรถูกล้าง เหตุใดจึงไม่เรียกว่า "ใช้สแต็กเพื่อทริกเกอร์การล้างข้อมูล" (UTSTTC :)? คุณจะเดินทางจากที่นั่นไปยัง "RAII" ได้อย่างไร? และคุณจะสร้างบางสิ่งบนสแต็กที่จะทำให้เกิดการล้างบางสิ่งที่อาศัยอยู่บนฮีปได้อย่างไร? นอกจากนี้ยังมีกรณีที่คุณไม่สามารถใช้ RAII ได้หรือไม่? คุณเคยคิดว่าตัวเองอยากเก็บขยะไหม? อย่างน้อยคนเก็บขยะที่คุณสามารถใช้สำหรับวัตถุบางอย่างในขณะที่ปล่อยให้คนอื่นจัดการ? ขอบคุณ.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.