เหตุใดพอยน์เตอร์อัจฉริยะจึงมาแทน new และ delete แบบดิบ
ทำความเข้าใจ RAII และเหตุผลที่การเป็นเจ้าของพอยน์เตอร์ดิบมักไม่ใช่แนวทางที่ถูกต้องใน C++ สมัยใหม่
เหตุใดพอยน์เตอร์อัจฉริยะจึงมาแทน new และ delete แบบดิบ เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
new และ delete แบบดิบ
มรดกจาก C: new T จัดสรร T บนฮีป ส่วน delete จะคืนหน่วยความจำ คุณต้องจับคู่ new ทุกครั้งกับ delete หนึ่งครั้งพอดี — มิฉะนั้นจะเกิดหน่วยความจำรั่วหรือโปรแกรมหยุดทำงาน
Widget* w = new Widget();
// ... use w ...
delete w; // forget this and you leakสิ่งที่ผิดพลาด
ปัญหาที่พบบ่อย:
- ลืม
delete— หน่วยความจำรั่ว - เรียก
deleteสองครั้ง — พฤติกรรมไม่กำหนด - เกิดข้อยกเว้นระหว่าง
newกับdelete— หน่วยความจำรั่ว - ส่งคืนพอยน์เตอร์ดิบโดยไม่ชัดเจนว่าใครเป็นเจ้าของ
RAII ช่วยแก้ปัญหา
การได้มาซึ่งทรัพยากรคือการกำหนดค่าเริ่มต้น: ผูกอายุการใช้งานของทรัพยากรเข้ากับอายุการใช้งานของออบเจ็กต์บนสแตก ตัวทำลายจะคืนทรัพยากรให้ — แม้จะเกิดข้อยกเว้นก็ตาม
แนวคิดพอยน์เตอร์อัจฉริยะ
พอยน์เตอร์อัจฉริยะคือสิ่งห่อหุ้มแบบ RAII ขนาดเล็กที่ครอบพอยน์เตอร์ดิบไว้ ตัวทำลายจะเรียก delete ให้ คุณจึงไม่ลืมคืนหน่วยความจำ
พอยน์เตอร์อัจฉริยะสามชนิด
พอยน์เตอร์อัจฉริยะของไลบรารีมาตรฐานใน <memory>:
std::unique_ptr<T>— ความเป็นเจ้าของแต่เพียงผู้เดียวstd::shared_ptr<T>— ความเป็นเจ้าของร่วมพร้อมการนับการอ้างอิงstd::weak_ptr<T>— ตัวเฝ้าดู shared_ptr ที่ไม่ถือครองความเป็นเจ้าของ
พอยน์เตอร์อัจฉริยะมีต้นทุนต่ำ
unique_ptr ไม่มีค่าใช้จ่ายส่วนเกิน (มีขนาดและความเร็วเท่ากับพอยน์เตอร์ดิบ) ส่วน shared_ptr มีต้นทุนเล็กน้อยจากตัวนับการอ้างอิงแบบอะตอมิก
ไม่ต้องเรียก delete เองอีก
เมื่อใช้พอยน์เตอร์อัจฉริยะ คุณแทบไม่ต้องเขียน delete เลย ตัวทำลายจะจัดการให้
#include <memory>
std::unique_ptr<Widget> w = std::make_unique<Widget>();
// no delete needed — when w goes out of scope, Widget is destroyedพอยน์เตอร์อัจฉริยะกับข้อยกเว้น
หากเกิดข้อยกเว้นระหว่างฟังก์ชัน ตัวแปรเฉพาะที่จะแตกออกตามลำดับย้อนกลับ พอยน์เตอร์อัจฉริยะจะคืนทรัพยากรโดยอัตโนมัติ — แต่พอยน์เตอร์ดิบจะทำให้เกิดหน่วยความจำรั่ว
ความเป็นเจ้าของอยู่ในชนิดข้อมูล
ชนิดของพอยน์เตอร์อัจฉริยะจะระบุความเป็นเจ้าของไว้ในตัว การอ่านลายเซ็นของฟังก์ชันจะบอกได้ว่าใครเป็นเจ้าของออบเจ็กต์
// I take ownership
void consume(std::unique_ptr<Widget> w);
// I look but do not own
void inspect(const Widget& w);พอยน์เตอร์ดิบยังมีประโยชน์
ใช้พอยน์เตอร์ดิบหรือการอ้างอิงสำหรับการเข้าถึงแบบ ไม่ถือครองความเป็นเจ้าของ สิ่งเหล่านี้สื่อว่า "ฉันกำลังยืม ไม่ได้เป็นเจ้าของ"
แทนที่ new ด้วยฟังก์ชัน make
ควรเลือก std::make_unique (C++14) และ std::make_shared (C++11) ทั้งสองอย่างปลอดภัยเมื่อเกิดข้อยกเว้นและมีประสิทธิภาพสูงกว่าการเรียก new โดยตรงเล็กน้อย
auto w = std::make_unique<Widget>(42);
auto s = std::make_shared<Resource>("file.txt");ตรวจสอบความเข้าใจ
เหตุผลหลักที่ควรใช้ std::unique_ptr แทนคู่ new/delete แบบดิบคืออะไร
สรุปทบทวน
new/delete แบบดิบมีโอกาสเกิดข้อผิดพลาดสูง พอยน์เตอร์อัจฉริยะจะห่อออบเจ็กต์ที่จัดสรรบนฮีปไว้ในตัวจัดการแบบ RAII ซึ่งคืนทรัพยากรโดยอัตโนมัติ ควรเลือก std::make_unique และ std::make_shared เพื่อความปลอดภัยและประสิทธิภาพ
คำถามที่พบบ่อย
บทเรียน “เหตุใดพอยน์เตอร์อัจฉริยะจึงมาแทน new และ delete แบบดิบ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เหตุใดพอยน์เตอร์อัจฉริยะจึงมาแทน new และ delete แบบดิบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เหตุใดพอยน์เตอร์อัจฉริยะจึงมาแทน new และ delete แบบดิบ”
ทำความเข้าใจ RAII และเหตุผลที่การเป็นเจ้าของพอยน์เตอร์ดิบมักไม่ใช่แนวทางที่ถูกต้องใน C++ สมัยใหม่ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “เหตุใดพอยน์เตอร์อัจฉริยะจึงมาแทน new และ delete แบบดิบ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุใดพอยน์เตอร์อัจฉริยะจึงมาแทน new และ delete แบบดิบ
- unique_ptr และการครอบครองแต่เพียงผู้เดียว
- shared_ptr และ weak_ptr กับการครอบครองร่วมกัน
- ตัวลบแบบกำหนดเองและฟังก์ชันสร้าง