คุณหมายถึงต้องการที่จะเพิ่มหน่วยความจำด้วยตนเอง, ปิดไฟล์, สิ่งของประเภทนี้? ถ้าเป็นเช่นนั้นฉันจะบอกว่าขั้นต่ำและโดยทั่วไปแล้วจะน้อยกว่าภาษาอื่น ๆ ส่วนใหญ่ที่ฉันเคยใช้โดยเฉพาะอย่างยิ่งถ้าเราพูดคุยทั่วไปว่าไม่ใช่แค่ "การจัดการหน่วยความจำ" แต่ "การจัดการทรัพยากร" ในแง่นั้นฉันคิดว่า C ++ ต้องการการจัดการทรัพยากรด้วยตนเองน้อยกว่าพูด Java หรือ C #
สาเหตุหลักมาจาก destructors ที่ทำลายทรัพยากรโดยอัตโนมัติ (หน่วยความจำหรืออย่างอื่น) โดยทั่วไปครั้งเดียวที่ฉันต้องฟรี / ทำลายทรัพยากรด้วยตนเองใน C ++ คือถ้าฉันใช้โครงสร้างข้อมูลระดับต่ำ (สิ่งที่คนส่วนใหญ่ไม่จำเป็นต้องทำ) หรือใช้ C API ที่ฉันใช้เวลาเพียงเล็กน้อย การรวมรีซอร์ส C ที่ต้องอิสระ / ทำลาย / ปิดด้วยตนเองลงใน wrapper C ++ ที่สอดคล้องกับ RAII
แน่นอนว่าหากผู้ใช้ต้องการปิดภาพในซอฟต์แวร์แก้ไขภาพฉันต้องลบภาพออกจากคอลเลกชันหรือบางสิ่งบางอย่าง แต่หวังว่าจะไม่นับเป็นการจัดการ "หน่วยความจำ" หรือ "ทรัพยากร" ของสิ่งที่มีความสำคัญในบริบทนี้เนื่องจากเป็นสิ่งที่จำเป็นสำหรับภาษาใด ๆ หากคุณต้องการเพิ่มหน่วยความจำที่เกี่ยวข้องกับภาพในเวลานั้น แต่อีกสิ่งที่คุณต้องทำคือลบภาพออกจากคอลเลกชันและตัวทำลายรูปดูแลส่วนที่เหลือ
ในขณะเดียวกันถ้าฉันเปรียบเทียบกับพูด Java หรือ C # คุณมักจะพบคนที่ต้องปิดไฟล์ด้วยตนเองมีการปลดการเชื่อมต่อซ็อกเก็ตด้วยตนเองตั้งค่าการอ้างอิงวัตถุเป็นโมฆะเพื่อให้พวกเขารวบรวมขยะ ฯลฯ มีหน่วยความจำแบบแมนนวลมากมาย การจัดการทรัพยากรในภาษาเหล่านั้นถ้าคุณถามฉัน ใน C ++ คุณมักไม่จำเป็นต้องunlock
มี mutex ด้วยตนเองเนื่องจาก mutex locker จะทำเช่นนั้นให้คุณโดยอัตโนมัติเมื่อ mutex อยู่นอกขอบเขต ตัวอย่างเช่นคุณไม่ควรทำสิ่งนี้ใน C ++:
System.IO.StreamReader file = new System.IO.StreamReader(path);
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
...
}
finally
{
if (file != null)
file.Close();
}
ไม่จำเป็นต้องทำสิ่งต่าง ๆ เช่นปิดไฟล์ด้วยตนเองใน C ++ พวกเขาจะปิดตัวเองโดยอัตโนมัติทันทีที่พวกเขาออกนอกขอบเขตไม่ว่าพวกเขาจะออกนอกขอบเขตเนื่องจากผลลัพธ์หรือเส้นทางการดำเนินการปกติหรือพิเศษ std::vector
สิ่งที่คล้ายกันสำหรับทรัพยากรหน่วยความจำที่เกี่ยวข้องเช่น รหัสดังกล่าวfile.Close()
ข้างต้นมักจะขมวดคิ้วตั้งแต่โดยเฉพาะอย่างยิ่งในบริบทของfinally
บล็อกที่แนะนำทรัพยากรในท้องถิ่นจะต้องมีอิสระด้วยตนเองเมื่อความคิดทั้งหมดรอบ C ++ คือการทำให้เป็นอัตโนมัติ
ในแง่ของการจัดการหน่วยความจำแบบแมนนวลผมว่า C ต้องการค่าสูงสุดปานกลาง Java / C # จำนวนปานกลางและต่ำสุดในกลุ่ม C ++ มีหลายเหตุผลที่การใช้ C ++ ค่อนข้างลำบากเนื่องจากเป็นภาษาที่ยากมากในการควบคุม แต่การจัดการหน่วยความจำไม่ควรเป็นหนึ่งในนั้น ในทางตรงกันข้ามฉันคิดว่ามันเป็นหนึ่งในภาษาที่ง่ายที่สุดในแง่มุมนี้
แน่นอนว่า C ++ จะช่วยให้คุณเริ่มการจัดสรรหน่วยความจำด้วยตนเองและเรียกใช้operator delete/delete[]
เพื่อเพิ่มหน่วยความจำด้วยตนเอง นอกจากนี้ยังให้คุณใช้ฟังก์ชัน C เช่นmalloc
และfree
. แต่นั่นเป็นวิธีการเขียนโค้ดแบบโบราณที่ฉันคิดว่าล้าสมัยมานานก่อนที่ผู้คนจะให้เครดิตเนื่องจาก Stroustrup ให้การสนับสนุน RAII ก่อนที่เขาจะประกาศเกียรติคุณตั้งแต่ต้น ดังนั้นฉันจึงไม่คิดว่ามันยุติธรรมที่จะพูดว่า "modern C ++" โดยอัตโนมัติการจัดการทรัพยากรเพราะมันควรจะเป็นวัตถุประสงค์ตลอด คุณไม่สามารถรับข้อยกเว้นด้านความปลอดภัยได้ เป็นเพียงนักพัฒนาที่เข้าใจผิดจำนวนมากในช่วงต้นทศวรรษ 90 ที่พยายามใช้ C ++ เหมือนกับ C กับวัตถุมักจะละเลยการจัดการข้อยกเว้นอย่างสมบูรณ์และไม่ควรใช้วิธีนั้น หากคุณใช้ C ++ ตามที่ตั้งใจไว้เสมอเพื่อใช้งานการจัดการหน่วยความจำนั้นเป็นแบบอัตโนมัติทั้งหมดและโดยทั่วไปไม่ใช่สิ่งที่คุณต้องจัดการด้วยตนเอง (หรือควรจัดการกับ) ด้วยตนเอง