欢迎关注Hadoop、Spark、Flink、Hive、Hbase、Flume等大数据资料分享微信公共账号:iteblog_hadoop
  1. 文章总数:960
  2. 浏览总数:11,441,382
  3. 评论:3867
  4. 分类目录:102 个
  5. 注册用户数:5823
  6. 最后更新:2018年10月13日
过往记忆博客公众号iteblog_hadoop
欢迎关注微信公众号:
iteblog_hadoop
大数据技术博客公众号bigdata_ai
大数据猿:
bigdata_ai

C++怎么设计只能在堆或者栈分配空间的类

一般情况下,编写一个类,是可以在栈或者堆分配空间。但有些时候,你想编写一个只能在栈或者只能在堆上面分配空间的类。这能不能实现呢?肯定是可以的。

  1. 只能在堆上分配空间:我们可将类的析构函数用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; 
    } 
    
  2. 只能在栈上分配空间:可将 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;
    }
    
本博客文章除特别声明,全部都是原创!
转载本文请加上:转载自过往记忆(https://www.iteblog.com/)
本文链接: 【C++怎么设计只能在堆或者栈分配空间的类】(https://www.iteblog.com/archives/211.html)
喜欢 (1)
分享 (0)
发表我的评论
取消评论

表情
本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!