当我们规定类只能在堆上分配内存时,就可以将析构函数声明为私有的。
如果在栈上分配空间,类在离开作用域时会调用析构函数释放空间,此时无法调用私有的析构函数。
如果在堆上分配空间,只有在delete时才会调用析构函数。
可以添加一个destroy()函数来释放,从而解决不能在析构函数中添加delete的问题。
/**
//HeapOnly.cpp
#include <iostream>
using namespace std;
class HeapOnly {
public :HeapOnly() {cout << "Structor." << endl;}void destroy() const {cout << "destructor" << endl;delete this;}
private :~HeapOnly() {}
};
int main() {HeapOnly *p = new HeapOnly;p->destroy();// HeapOnly h;// h.Output();return 0;
}
**/
//StackOnly.cpp
#include <iostream>
using namespace std;
class StackOnly {
public :StackOnly() {cout << "constructor." << endl;}~StackOnly() {cout << "destructor." << endl;}
private :static void* operator new(size_t);
};
int main() {StackOnly s; ///okay//StackOnly *p = new StackOnly; ///wrongreturn 0;
}