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

ข้อควรระวังและอายุการใช้งาน

หลีกเลี่ยงวิวลอย

ข้อควรระวังและอายุการใช้งาน เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

มุมมองไม่ได้เป็นเจ้าของข้อมูล

string_view ชี้ไปยังอักขระที่มีเจ้าของอยู่ที่อื่นเท่านั้น หากหน่วยจัดเก็บนั้นหายไป มุมมองจะกลายเป็นอ้างอิงลอยค้าง และการเข้าถึงมุมมองจะมีพฤติกรรมที่ไม่กำหนด

การอ้างอิงลอยค้างจากค่าชั่วคราว

การผูกมุมมองเข้ากับ std::string ชั่วคราวเป็นอันตราย เพราะค่าชั่วคราวจะถูกทำลายเมื่อจบคำสั่ง ทำให้มุมมองชี้ไปยังหน่วยความจำที่ถูกคืนแล้ว

#include <string>
#include <string_view>
std::string make() { return "temp"; }
int main() {
    std::string_view sv = make(); // dangles immediately
    // using sv here is undefined behavior
    (void)sv;
}

การส่งคืนมุมมองไปยังตัวแปรท้องถิ่น

อย่าส่งคืนมุมมองที่ชี้เข้าไปในสตริงท้องถิ่น เพราะตัวแปรท้องถิ่นจะถูกทำลายเมื่อฟังก์ชันส่งคืนค่า

#include <string>
#include <string_view>
std::string_view bad() {
    std::string local = "oops";
    return local; // local dies, view dangles
}
int main() { (void)bad(); }

ปลอดภัย: มุมมองของสตริงที่ยังใช้งานอยู่

มุมมองใช้งานได้ตราบใดที่ข้อมูลต้นทางมีอายุยาวนานกว่ามุมมอง ในกรณีนี้สตริงมีอายุการใช้งานครอบคลุมทั้งฟังก์ชัน

#include <iostream>
#include <string>
#include <string_view>
int main() {
    std::string s = "alive";
    std::string_view sv = s;
    std::cout << sv << "\n"; // safe
}

ไม่ได้ลงท้ายด้วยค่า null

ข้อมูลของมุมมองไม่รับประกันว่าจะลงท้ายด้วย \0 การส่ง sv.data() ไปยังฟังก์ชัน C ที่คาดว่าจะรับสตริง C อาจทำให้ฟังก์ชันอ่านเลยจุดสิ้นสุดได้

ใช้ size() ไม่ใช่ strlen

ควรใช้ sv.size() เพื่ออ่านความยาวเสมอ แทนฟังก์ชันของสตริง C เนื่องจากมุมมองอาจเป็นเพียงส่วนหนึ่งของบัฟเฟอร์ขนาดใหญ่กว่า

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = std::string_view("hello world").substr(0, 5);
    std::cout << sv.size() << "\n"; // 5, not 11
}

การแก้ไขข้อมูลต้นทาง

หากมีการจัดสรรสตริงต้นทางใหม่ เช่น push_back ทำให้ความจุเพิ่มขึ้น มุมมองเดิมที่อ้างถึงสตริงนั้นจะใช้งานไม่ได้

การเก็บมุมมองไว้ในสมาชิก

โปรดระวังการเก็บ string_view ไว้เป็นสมาชิกของคลาส คุณต้องรับประกันว่าข้อมูลที่อ้างถึงจะมีอายุยาวนานกว่าวัตถุ หากไม่แน่ใจ ให้เก็บ std::string แทน

พารามิเตอร์มักปลอดภัย

การใช้ string_view เป็นพารามิเตอร์ของฟังก์ชันเป็นกรณีที่ปลอดภัยและเป็นแนวทางตามสำนวนภาษา เพราะอาร์กิวเมนต์มีอายุยาวนานกว่าการเรียกฟังก์ชัน

#include <iostream>
#include <string_view>
size_t len(std::string_view sv) { return sv.size(); }
int main() {
    std::cout << len("temporary is fine here") << "\n";
}

คัดลอกเมื่อจำเป็นต้องเก็บไว้

หากต้องเก็บข้อความไว้นานกว่าอายุการใช้งานของข้อมูลต้นทาง ให้คัดลอกลงใน std::string การคัดลอกคือราคาที่ต้องจ่ายเพื่อเป็นเจ้าของข้อมูล

#include <string>
#include <string_view>
std::string keep(std::string_view sv) {
    return std::string(sv); // owns a copy
}
int main() { (void)keep("persist"); }

หลักทั่วไป

ควรใช้ string_view สำหรับพารามิเตอร์และตัวแปรท้องถิ่นที่มีอายุสั้น หลีกเลี่ยงการใช้เป็นชนิดค่าที่ส่งคืนหรือสมาชิกที่มีอายุยาวนาน เว้นแต่อายุการใช้งานของข้อมูลจะยาวนานกว่าอย่างชัดเจน

ตรวจสอบความเข้าใจ

ตรวจสอบความเข้าใจของคุณเกี่ยวกับอายุการใช้งานของมุมมอง

สรุป

คุณได้เรียนรู้เกี่ยวกับข้อควรระวังและอายุการใช้งานของมุมมอง:

  • มุมมองไม่ได้เป็นเจ้าของข้อมูล ข้อมูลต้นทางต้องมีอายุยาวนานกว่ามุมมอง
  • หลีกเลี่ยงการใช้มุมมองกับค่าชั่วคราวและตัวแปรท้องถิ่น
  • มุมมองไม่รับประกันว่าจะลงท้ายด้วยค่า null ให้ใช้ size()
  • คัดลอกลงใน std::string เมื่อต้องการเก็บข้อความไว้ต่อ

คำถามที่พบบ่อย

บทเรียน “ข้อควรระวังและอายุการใช้งาน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ข้อควรระวังและอายุการใช้งาน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ข้อควรระวังและอายุการใช้งาน”

หลีกเลี่ยงวิวลอย คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ข้อควรระวังและอายุการใช้งาน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เหตุผลที่ใช้ string_view
  2. การสร้างวิว
  3. ข้อควรระวังและอายุการใช้งาน
  4. อัลกอริทึมสตริง
← กลับไปที่ C++ Academy