一般情况下,编写一个类,是可以在栈或者堆分配空间。但有些时候,你想编写一个只能在栈或者只能在堆上面分配空间的类。这能不能实现呢?肯定是可以的。
- 只能在堆上分配空间:我们可将类的析构函数用private来修饰,也就是把析构函数私有化,因为自动变量与静态变量的对象都在释放空间的时候都需要访问析构函数。若析构函数私有,外面就不能调用,这时候会产生编译错误,这样就达到了只能在堆上分配空间了。但是,把析构函数私有化,那么我们就不能调用delete了, 因为它也需要访问析构函数。这就要求我们自己去提供回收内存空间的函数,以防内存泄漏。
#include<iostream> using namespace std; class HeapOnly{ public:HeapOnly() { cout <<"This is a constructor function."<<endl;} void destroyClass() const{delete this; } private:~HeapOnly() {} //外面不能调用了 }; int main(){ HeapOnly *heapOnly = new HeapOnly; heapOnly ->destroyClass(); return 0; }
- 只能在栈上分配空间:可将 T:: operator new 全部私有,因为要在堆上分配空间,需要用到new来实现,当你把new私有化,我们就不能调用new T()这样的语句,这样可以达到只能在栈上来分配空间了。
#include<iostream> using namespace std; class StackOnly{ public:StackOnly() { cout <<"This is a constructor function."<<endl;} ~StackOnly() { cout<<"destructor Class."<<endl;} private:void* operator new(size_t);//注意这里 }; int main(){ StackOnly stackOnly; //这个可以 StackOnly *p_stackOnly = new StackOnly;//这个不可以,因为new私有了 return 0; }
原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
本文链接: 【C++怎么设计只能在堆或者栈分配空间的类】(https://www.iteblog.com/archives/211.html)