namespace t15 { class Heap { public: // 用户可以调用new创建对象 Heap() { p = malloc(100); } void destroy() { delete this; } private: // 用户无法调用delete删除对象 ~Heap() { free(p); } private: void *p; }; }; void test15() { t15::Heap *p = new t15::Heap(); p->destroy(); }
编译器在栈上创建对象时,如果类的析构函数是私有的,则无法回收栈上的内存。因此无法在栈上创建。
通过new创建对象,但是无法通过delete删除对象,需要提供额外的destroy()函数
因为栈上分配内存时,用完后会自动释放,所以会先检查析构函数是否可以调用,若不能调用则不能在栈上分配空间。
故只要将析构函数设为私有,即可限制内存的分配。
将构造函数设为私有
将析构函数设为私有