ภาพรวม
Static Object ใน C++ คือออบเจ็กต์ที่ประกาศด้วยคีย์เวิร์ด static มีคุณสมบัติ:
- ถูก Initialize เพียงครั้งเดียว (ครั้งแรกที่ผ่านบรรทัดโค้ด)
- เก็บอยู่ใน Static Storage Area (ไม่ใช่ Stack/Heap)
- ถูกทำลาย (Destroyed) เฉพาะเมื่อโปรแกรมจบการทำงาน (Program Termination)
- มีอายุชีวิตตลอดการรันโปรแกรม (Program Lifetime)
ตัวอย่างโค้ด
#include <iostream>
using namespace std;
class Base {
public:
void func() {
int a = 20;
cout << "The value of a : " << a;
}
};
int main() {
static Base b; // Static object
b.func();
return 0; // b ถูกทำลายที่นี่ (program ends)
}
ผลลัพธ์
The value of a : 20
รายละเอียด
static Base b;สร้างออบเจ็กต์ใน Static Storage- Constructor ถูกเรียกครั้งแรกที่ผ่านบรรทัดนี้ (Guaranteed initialization)
- Destructor จะถูกเรียกเมื่อ
main()จบ (หรือexit()ถูกเรียก) - ต่างจาก Local Object (Automatic Storage) ที่ทำลายเมื่อออกจาก Scope
กรณี Static Object ในฟังก์ชัน (Function-Local Static)
void func() {
static Base b; // สร้างครั้งแรกที่เรียก func()
b.func();
} // b ไม่ถูกทำลายที่นี่!
int main() {
func(); // สร้าง b
func(); // ใช้ b เดิม (ไม่สร้างใหม่)
return 0; // b ถูกทำลายตอนโปรแกรมจบ
}
ลำดับการทำลาย (Destruction Order)
- Static objects ใน Translation Unit เดียวกัน: ทำลายในลำดับกลับกันกับการสร้าง (Reverse Order)
- Static objects ใน Translation Unit ต่างกัน: ลำดับไม่แน่นอน (Unspecified)
- ทำลายก่อน global objects ที่ไม่ใช่ static? ไม่ ไม่มีการรับประกันลำดับข้าม TU
ข้อควรระวัง
- Static objects ใน DLL/Shared Library: อาจถูกทำลายตอน Unload Library
- การใช้
atexit()หรือstd::atexitสำหรับ cleanup เพิ่มเติม - Thread-local static (
thread_local) ทำลายเมื่อ Thread จบ