nullptr และความปลอดภัยของพอยน์เตอร์ว่าง
ใช้ nullptr แทน NULL หรือ 0 และป้องกันการถอดค่าจากพอยน์เตอร์ว่าง
nullptr และความปลอดภัยของพอยน์เตอร์ว่าง เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
พอยน์เตอร์ค่าว่างคืออะไร
พอยน์เตอร์ค่าว่าง คือค่าพิเศษที่ชี้ไปยัง "ไม่มีสิ่งใด" การถอดการอ้างอิงจะมีพฤติกรรมที่ไม่กำหนด — โดยปกติโปรแกรมจะหยุดทำงานด้วยข้อผิดพลาดการแบ่งส่วน
nullptr ใน C++ สมัยใหม่
ตั้งแต่ C++11 เป็นต้นมา คีย์เวิร์ด nullptr ใช้แทนลิเทอรัลพอยน์เตอร์ค่าว่างที่มีชนิด ควรใช้สิ่งนี้แทน NULL หรือ 0
int* p1 = nullptr;
int* p2 = NULL; // legacy macro
int* p3 = 0; // legacy literalเหตุใดจึงใช้ nullptr
NULL เป็นเพียงมาโครของ 0 จึงอาจทำให้การเลือกฟังก์ชันโอเวอร์โหลดระหว่าง int และ int* สับสนได้ ส่วน nullptr มีชนิดเฉพาะคือ std::nullptr_t
void f(int);
void f(int*);
f(NULL); // calls f(int) -- surprising!
f(nullptr); // calls f(int*) -- correctการตรวจสอบค่าว่าง
พอยน์เตอร์จะแปลงเป็น bool โดยปริยาย: ค่าที่ไม่ใช่ค่าว่างคือจริง และค่าว่างคือเท็จ
if (p) std::cout << "has value\n";
if (!p) std::cout << "is null\n";
if (p != nullptr) std::cout << "explicit form\n";เริ่มต้นค่าเสมอ
พอยน์เตอร์ที่ยังไม่ได้เริ่มต้นจะมีค่าขยะและทำเหมือนว่าชี้ไปที่ใดที่หนึ่ง ควรเริ่มต้นค่าเสมอ แม้จะเริ่มต้นเป็น nullptr เท่านั้นก็ตาม
int* p; // BAD: undefined contents
int* q = nullptr; // GOODการถอดการอ้างอิงค่าว่าง
การอ่านหรือเขียนผ่านพอยน์เตอร์ค่าว่างจะมีพฤติกรรมที่ไม่กำหนด ในระบบเดสก์ท็อปส่วนใหญ่จะเกิดข้อผิดพลาดการแบ่งส่วน ส่วนอุปกรณ์ฝังตัวอาจทำให้หน่วยความจำเสียหายโดยไม่แสดงอาการ
การตรวจสอบเพื่อป้องกัน
ตรวจสอบก่อนถอดการอ้างอิงในอินเทอร์เฟซ API สาธารณะ หรือเมื่อผู้เรียกอาจส่งค่าว่างมา
void process(int* data) {
if (!data) return;
*data *= 2;
}ใช้การอ้างอิงแทนพอยน์เตอร์
หากค่าว่างไม่มีความหมาย ให้ใช้พารามิเตอร์แบบการอ้างอิง คอมไพเลอร์จะรับประกันว่าการอ้างอิงนั้นผูกอยู่กับสิ่งใดสิ่งหนึ่ง
// Before
void f(Widget* w); // can be null?
// After
void f(Widget& w); // must be a real widgetstd::optional สำหรับค่าที่มีหรือไม่มีได้
C++17 เพิ่ม std::optional<T> เพื่อสื่อความหมายแบบ "อาจมีค่า" ซึ่งชัดเจนกว่าพอยน์เตอร์ที่เป็นค่าว่างได้ในบริบทที่ไม่ได้จัดสรรหน่วยความจำ
#include <optional>
std::optional<int> find(int x);
if (auto v = find(42)) std::cout << *v;พอยน์เตอร์อัจฉริยะและค่าว่าง
std::unique_ptr และ std::shared_ptr ก็เป็นค่าว่างได้เช่นกัน ทั้งสองชนิดจะแปลงเป็น bool สำหรับการตรวจสอบ และกำหนดค่าใหม่ด้วย = nullptr
ข้อผิดพลาด: พอยน์เตอร์ห้อยหลังการลบ
หลังจาก delete p พอยน์เตอร์ยังคงเก็บที่อยู่เดิมอยู่ ให้กำหนดค่าใหม่เป็น p = nullptr; พอยน์เตอร์อัจฉริยะจะทำเช่นนี้โดยอัตโนมัติ
ตรวจสอบความเข้าใจ
ใน C++ สมัยใหม่ ควรใช้ลิเทอรัลพอยน์เตอร์ค่าว่างตัวใด
สรุปทบทวน
ใช้ nullptr สำหรับค่าพอยน์เตอร์ค่าว่าง เริ่มต้นค่าพอยน์เตอร์เสมอ ตรวจสอบก่อนถอดการอ้างอิง หรือทางที่ดีกว่านั้นคือใช้การอ้างอิงและ std::optional เมื่อค่าว่างไม่ใช่ค่าที่ใช้ได้
คำถามที่พบบ่อย
บทเรียน “nullptr และความปลอดภัยของพอยน์เตอร์ว่าง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “nullptr และความปลอดภัยของพอยน์เตอร์ว่าง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “nullptr และความปลอดภัยของพอยน์เตอร์ว่าง”
ใช้ nullptr แทน NULL หรือ 0 และป้องกันการถอดค่าจากพอยน์เตอร์ว่าง คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “nullptr และความปลอดภัยของพอยน์เตอร์ว่าง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พอยน์เตอร์ดิบและตัวดำเนินการหาที่อยู่
- การถอดค่าพอยน์เตอร์และเลขคณิตของพอยน์เตอร์
- nullptr และความปลอดภัยของพอยน์เตอร์ว่าง
- เมื่อใดควรใช้พอยน์เตอร์หรือรีเฟอเรนซ์