Để ép buộc đối tượng chỉ được tạo trên heap (bằng new), ta làm private destructor. Biên dịch sẽ báo lỗi nếu tạo đối tượng trên stack vì không thể gọi destructor khi ra khỏi scope.
Kỹ thuật
- Đặt destructor
private. - Cung cấp
friendfunction để xóa đối tượng (tránh rò rỉ bộ nhớ).
Ví dụ
#include <iostream>
using namespace std;
class NoDirectObjClass {
private:
~NoDirectObjClass() {
cout << "Destroying NoDirectObjClass object" << endl;
}
public:
NoDirectObjClass() {
cout << "Creating object" << endl;
}
friend void friend_destructor(NoDirectObjClass*);
};
void friend_destructor(NoDirectObjClass* p) {
delete p;
cout << "Destroying object using friend" << endl;
}
int main() {
NoDirectObjClass* p = new NoDirectObjClass; // OK
friend_destructor(p);
// NoDirectObjClass obj; // LỖI COMPILE: destructor private
return 0;
}
Kết quả
Creating object Destroying NoDirectObjClass object Destroying object using friend
Nếu cố tạo trên stack
main.cpp: In function 'int main()':
main.cpp:22:22: error: 'NoDirectObjClass::~NoDirectObjClass()' is private within this context
NoDirectObjClass t1;
^~
main.cpp:6:9: note: declared private here
~NoDirectObjClass() {
^
Ứng dụng: Singleton, pool allocator, quản trị vòng đời phức tạp.