0Pricing
C++ Academy · บทเรียน

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 widget

std::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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พอยน์เตอร์ดิบและตัวดำเนินการหาที่อยู่
  2. การถอดค่าพอยน์เตอร์และเลขคณิตของพอยน์เตอร์
  3. nullptr และความปลอดภัยของพอยน์เตอร์ว่าง
  4. เมื่อใดควรใช้พอยน์เตอร์หรือรีเฟอเรนซ์
← กลับไปที่ C++ Academy