อายุการใช้งานของออบเจกต์
ช่วงเวลาที่ออบเจกต์ถูกสร้างและทำลาย
อายุการใช้งานของออบเจกต์ เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
เมื่อออบเจ็กต์ถูกสร้างขึ้น
อายุการใช้งานของออบเจ็กต์เริ่มต้นหลังจากจัดสรรพื้นที่จัดเก็บและตัวสร้างทำงานเสร็จสิ้น ตั้งแต่นั้นเป็นต้นมา ออบเจ็กต์จึงพร้อมใช้งานอย่างสมบูรณ์
#include <iostream>
struct Widget {
Widget() { std::cout << "born\n"; }
};
int main() {
Widget w; // constructor runs here
}เมื่อออบเจ็กต์สิ้นอายุการใช้งาน
อายุการใช้งานสิ้นสุดลงเมื่อตัวทำลายทำงาน สำหรับออบเจ็กต์บนสแตก เหตุการณ์นี้เกิดขึ้นที่วงเล็บปีกกาปิดของขอบเขต
#include <iostream>
struct Widget {
~Widget() { std::cout << "dies\n"; }
};
int main() {
Widget w;
std::cout << "alive\n";
} // ~Widget runs hereลำดับการสร้างและการทำลาย
ออบเจ็กต์จะถูกทำลายใน ลำดับย้อนกลับจากการสร้าง ออบเจ็กต์ที่สร้างเป็นลำดับสุดท้ายจะถูกทำลายเป็นลำดับแรก
#include <iostream>
struct Tag {
int id;
Tag(int i) : id(i) { std::cout << "make " << id << "\n"; }
~Tag() { std::cout << "drop " << id << "\n"; }
};
int main() {
Tag a(1);
Tag b(2); // dropped before a
}อายุการใช้งานอัตโนมัติ (บนสแตก)
ออบเจ็กต์อัตโนมัติจะคงอยู่ตลอดช่วงเวลาของบล็อกที่ครอบออบเจ็กต์นั้นไว้ นี่เป็นรูปแบบอายุการใช้งานที่พบได้บ่อยและปลอดภัยที่สุด
อายุการใช้งานแบบไดนามิก (บนฮีป)
ออบเจ็กต์บนฮีปที่สร้างด้วย new จะคงอยู่จนกว่าจะเรียกใช้ delete อายุการใช้งานของออบเจ็กต์จึงถูกควบคุมโดยคุณ ไม่ใช่โดยขอบเขต
#include <iostream>
struct Widget {
~Widget() { std::cout << "dies\n"; }
};
int main() {
Widget* w = new Widget();
std::cout << "still alive\n";
delete w; // destructor runs here
}อายุการใช้งานแบบคงที่
ออบเจ็กต์ที่ใช้พื้นที่จัดเก็บแบบ static จะคงอยู่ตลอดทั้งโปรแกรม ตัวแปรแบบคงที่ภายในฟังก์ชันจะถูกสร้างขึ้นครั้งเดียวเมื่อมีการใช้งานครั้งแรก
#include <iostream>
int next() {
static int counter = 0; // built once
return ++counter;
}
int main() {
std::cout << next() << next() << next() << "\n";
}ออบเจ็กต์ชั่วคราว
ออบเจ็กต์ชั่วคราวที่สร้างขึ้นในนิพจน์มักจะสิ้นอายุการใช้งานเมื่อสิ้นสุดนิพจน์สมบูรณ์ (ที่เครื่องหมายเซมิโคลอน)
#include <iostream>
#include <string>
int main() {
std::cout << (std::string("a") + "b") << "\n";
} // temporary string dies after this lineสมาชิกถูกสร้างก่อนส่วนเนื้อหา
ออบเจ็กต์สมาชิกของคลาสจะถูกสร้างก่อนที่ส่วนเนื้อหาของตัวสร้างของออบเจ็กต์ที่ครอบอยู่จะทำงาน และจะถูกทำลายหลังจากส่วนเนื้อหาของตัวทำลายทำงานเสร็จ
#include <iostream>
#include <string>
struct Engine { Engine() { std::cout << "engine\n"; } };
struct Car {
Engine e;
Car() { std::cout << "car\n"; }
};
int main() { Car c; }การยืดอายุการใช้งานด้วยการอ้างอิง const
การผูกออบเจ็กต์ชั่วคราวเข้ากับ const& จะยืดอายุการใช้งานของออบเจ็กต์ให้เท่ากับอายุของการอ้างอิง นี่เป็นกฎ C++ ที่มีประโยชน์
#include <iostream>
#include <string>
int main() {
const std::string& s = std::string("hi");
std::cout << s << "\n"; // s still valid
}การใช้งานหลังสิ้นอายุการใช้งาน
การเข้าถึงออบเจ็กต์หลังจากอายุการใช้งานสิ้นสุดลงเป็นพฤติกรรมที่ไม่ได้กำหนดไว้ ซึ่งเป็นสาเหตุคลาสสิกของข้อผิดพลาดแบบ การอ้างอิงห้อยค้าง หรือ การใช้งานหลังคืนหน่วยความจำ
อายุการใช้งานเป็นรากฐานของ RAII
เนื่องจากตัวทำลายทำงานอย่างแน่นอนเมื่ออายุการใช้งานสิ้นสุดลง C++ จึงผูกการล้างทรัพยากรเข้ากับอายุการใช้งาน ซึ่งเป็นรากฐานของ RAII และจะกล่าวถึงในหลักสูตรถัดไป
ตรวจสอบความเข้าใจอย่างรวดเร็ว
โปรดทดสอบความเข้าใจเรื่องอายุการใช้งานของออบเจ็กต์
สรุปทบทวน
คุณได้เรียนรู้ว่า อายุการใช้งานของออบเจ็กต์เริ่มต้นหลังการสร้างและสิ้นสุดเมื่อถูกทำลาย ออบเจ็กต์อัตโนมัติทำตามขอบเขต ออบเจ็กต์แบบไดนามิกทำตาม new/delete และออบเจ็กต์แบบคงที่จะคงอยู่ตลอดทั้งโปรแกรม การทำลายเกิดขึ้นในลำดับย้อนกลับ ซึ่งเป็นพื้นฐานของ RAII
คำถามที่พบบ่อย
บทเรียน “อายุการใช้งานของออบเจกต์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “อายุการใช้งานของออบเจกต์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การจัดสรรบนสแตก
- การจัดสรรบนฮีพด้วย new/delete
- อายุการใช้งานของออบเจกต์
- ข้อบกพร่องของหน่วยความจำที่พบบ่อย