Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Static Object ใน C++ ถูกทำลายเมื่อไหร่?

ภาพรวม

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

รายละเอียด

  1. static Base b; สร้างออบเจ็กต์ใน Static Storage
  2. Constructor ถูกเรียกครั้งแรกที่ผ่านบรรทัดนี้ (Guaranteed initialization)
  3. Destructor จะถูกเรียกเมื่อ main() จบ (หรือ exit() ถูกเรียก)
  4. ต่างจาก 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 จบ