在 C++ 類設計中,析構函數的訪問控制直接影響對象的生命周期管理方式。將析構函數聲明為 protected 是一種經典設計模式,用於強制對象只能在堆上創建,禁止棧上分配。
將構造函數和析構函數均聲明為 protected,並提供靜態工廠方法控制創建與銷毀:
class A {
protected:
A() {} // 保護構造函數
~A() {} // 保護析構函數
public:
// 工廠方法:在堆上創建對象
static A* create() { return new A(); }
// 安全銷毀方法
void destroy() { delete this; }
};
// 正確:通過工廠方法創建
A* pa = A::create();
pa->destroy(); // 正確銷毀
// 錯誤:編譯報錯
// A a; // 棧上創建失敗:構造函數 protected
// delete pa; // 直接 delete 失敗:析構函數 protected
protected 析構函數不可訪問 → 編譯錯誤new A() 僅調用構造函數,不立即調用析構函數;delete this 在成員函數內部可訪問 protected 析構函數protected 析構函數,正常繼承不受影響AddRef/Release)destroy() 或 release()),否則會導致內存洩漏private 複製構造/賦值運算符防止拷貝std::unique_ptr 配合自定義刪除器)替代手動 delete thisclass A {
protected:
A() = default;
~A() = default;
// 禁止拷貝
A(const A&) = delete;
A& operator=(const A&) = delete;
public:
// 返回智能指針,自定義刪除器調用 protected 析構
static std::unique_ptr create() {
return {new A(), [](A* p) { p->~A(); delete p; }};
}
};
// 使用
auto ptr = A::create(); // 自動管理生命周期
總結:protected 析構函數是「強制堆分配」的核心技術,配合工廠方法實現對象生命周期的完全管控,是 C++ 資源管理高級模式的基石。